Hibernate вновь созданный объект слияние не удается - PullRequest
0 голосов
/ 23 января 2012

Я пытаюсь реализовать экран сохранения изменений / отмены изменений.

У меня есть один основной сеанс гибернации.Когда кто-то хочет отредактировать объект, я создаю временный сеанс и объединяю объект из основного сеанса.

// To edit Object x with id id_x
Object a = mainSession.get(id_x);
Object b = tempSession.merge(a);

// Change object b with tempSession

// If save: mainSession.merge(b) and discard tempSession.
// If cancel: discard b and tempSession.

...
...

// If saveAll: mainSession.flush();
// If cancellAll: mainSession.rollback(), reload all objects.

Это работает с элементами, которые уже находятся в базе данных.Но когда я хочу применить ту же логику к вновь созданному объекту, tempSession.merge (a) терпит неудачу.

Object d = new Object();
mainSession.save(d);
// To edit Object d with id id_d
Object a = mainSession.get(id_d);
Object b = tempSession.merge(a); // The application gets blocked/locked here.

Я думаю, что tempSession.merge пытается загрузить объект из базы данных, поскольку у tempSession нетобъект с id_d, но поскольку объект не существует в базе данных или таблица / строка заблокирована, происходит сбой.Есть ли способ создать копию объекта d и прикрепить его к tempSession, а затем повторно присоединить его к mainSession?Или вы можете предложить альтернативные способы реализации этого?

1 Ответ

0 голосов
/ 23 января 2012

Вам действительно нужна эта сложная установка с двумя сессиями? В общем случае не следует использовать несколько сеансов в одном потоке одновременно из-за возможных тупиков.

Существует множество способов достижения желаемого поведения без использования нескольких сеансов. Например, вы можете detach() загрузить объект из сеанса и объединить его в тот же сеанс позже. Или вы можете оставить объект прикрепленным и вызвать refresh(), если хотите отменить изменения.

...