2013-03-02 5 views
0
Collar collar = cat.getCollar(); 
    if(collar==null) { 
     collar = new Collar(cat); 
    } 

    collar.setStuds(true); 

    catDAO.mergeState(cat); 

Это жалуется, что воротник является переходным объектом и что он должен быть сохранен до того, как транзакция может быть сброшена.Может спящий режим сохранять новую сущность при обновлении родительского объекта

я могу это исправить, выполнив:

if(collar==null) { 
     collar = new Collar(cat); 
     catDao.makePersistent(); 
    } 

Правильно ли это? Разве Hibernate не должен заботиться о том, чтобы сохранить мою новую сущность для меня?

EDIT: дополнительная информация. Я использую Spring MVC версии 3.0.5 и Hibernate 3.

class Cat { 
     ... 
     @OneToOne(mappedBy="cat") 
     public Collar getCollar() { 
      return collar; 
     } 
     // etc 
    } 

    class Collar { 
     @OneToOne(optional = false, cascade = { CascadeType.PERSIST, 
      CascadeType.MERGE, CascadeType.REMOVE }, fetch = FetchType.LAZY) 
     @JoinColumn(name="CAT_ID", nullable = false) 
     public Cat getCat() { 
      return cat; 
     } 
     // etc 
    } 

Метод mergeState() в моей DAO вызывает entityManager.merge(cat)entityManager.flush() если требуется).

ответ

0

Нет, это не должно, если ваш метод mergeState() не вызывает merge() и связь между Cat и Воротник имеет атрибут cascade = MERGE (или ALL).

+0

Я редактировать мой вопрос включить отображения. Я предполагаю слияния с каскадом – carbontax

+0

Но у меня есть cascade = MERGE на сопоставлении, и мой вызов mergeState вызывает call merge(). Я добавил дополнительную информацию выше. Что-то не хватает? – carbontax

0

На самом деле вы пытаетесь сохранить объект Cat в строке catDAO.mergeState (cat);

И если вы определили отношение (например ... @OneToMany и т. Д.) Между Cat & Воротник в объекте Cat. Затем, если вы сохраняете кошку, он также сохранит ошейник дочернего объекта.

Да, вы должны также настроить каскад (ALL, и т.д.)

+0

Я отредактировал свой вопрос, чтобы указать, что такие сопоставления существуют, но я все равно должен сделать это в два этапа. – carbontax

+0

Каскад должен быть на 'Cat.getCollar()'. Не на 'Collar.getCat()'. Поскольку вы вызываете слияние на Cat и хотите, чтобы его каскадировали на его воротник. –

Смежные вопросы