Как использовать каскадные типы MERGE и PERSIST для многих операций сохранения или обновления?

У меня есть сопоставление, как показано ниже, в одном из моих объектов. При попытке сохранить этот объект, если идентификатор scrMSgLine уже установлен, а тип каскада — PERSIST, я получил исключение «org.hibernate.PersistentObjectException: отдельный объект, переданный для сохранения: ScrMsgLine». Если я изменю тип каскада на MERGE, запись будет успешно сохранена.

Если идентификатор scrMSgLine равен нулю, а тип каскада — MERGE, тогда я получаю исключение «объект ссылается на несохраненный переходный экземпляр — сохраните переходный экземпляр перед очисткой».

Итак, какой тип каскада я должен использовать, что я делаю неправильно?

@ManyToOne(cascade = {CascadeType.PERSIST})
@JoinColumn(name = "MSG_LINE_ID")
@Where(clause = "DELETED_AT IS NULL")
public ScrMsgLine getScrMsgLine() {
    return scrMsgLine;
}

person oguz karakus    schedule 13.02.2014    source источник


Ответы (2)


Оказалось, что это проблема транзакции, а не каскадного типа. Я создавал новый tnx после сохранения объекта scrMsgLine. Так что он отсоединялся, когда я передал его новому tnx. В качестве обходного пути я прочитал его из базы данных в начале нового tnx. И я изменил тип каскада на PERSIST. Я не уверен, что это правильное решение, но пока оно работает для меня...

person oguz karakus    schedule 14.02.2014

Чтобы избежать исключений; используйте метод слияния для сохранения ваших объектов вместо сохранения и используйте CascadeType.ALL на ScrMsgLine.

Пока ваши отношения установлены на CascadeType.ALL, вы всегда можете изменить свой em.persist(exam); em.merge(экзамен);. Это позаботится о сохранении нового объекта, а также вызовет каскадный вызов слияния в ScrMsgLine.

И эти вопросы и ответы могут оказаться более полезными.

Я надеюсь, что это помогает.

person Yusuf K.    schedule 13.08.2015