2013-04-19 2 views
2

У меня есть два объекта: User и Resume. Резюме имеет поле User user. В моем коде я сначала получаю объект user и делаю некоторые изменения на нем. В случае, если существует Resume.findByUser(user), я получаю резюме и там тоже делаю некоторые изменения.
Если я звоню user.save() и resume.save() Я получаю исключение, говоря, что есть другая ссылка на тот же объект в сеансе, поэтому я начал использовать merge().Grails GORM: DuplicateKeyException при слиянии

Когда я звоню user.merge() данные сохраняются, но когда я называю resume.merge() я получаю это исключение:
org.springframework.dao.DuplicateKeyException: a different object with the same identifier value was already associated with the session: [com.wizard.security.User#36]; nested exception is org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.wizard.security.User#36]

, которые я не знаю, что делать. Похож, проблема в объекте resume.user, который относится к тому же, что и user.

Буду благодарен за помощь в решении этой проблемы, спасибо.

+1

Не актуально, но я только заметил, что «Возобновить» - это «пользователь» назад + «я». Совпадение? –

ответ

5

Поскольку GORM построен на спящий режим, когда вы звоните сливаться на резюме, он будет каскадом вниз к полю пользователя.

Когда вы вызываете user.merge(), а затем resume.merge() в течение одной транзакции, к моменту вызова resume.merge() ваше поле пользователя имеет более новую версию в БД, чем ту, которая хранится в экземпляре резюме.

Предлагаю вам вызвать resume.user.refresh() или resume.refresh() перед внесением изменений и слиянием.

+0

Это было великолепие! Спасибо, ты действительно помог мне. – svz

+0

Добро пожаловать :) –

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