2012-01-23 3 views
0

Я пытаюсь реализовать экран изменения изменений/отмены изменений.Слишком новый созданный объект Hibernate

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

// 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? Или вы можете предложить альтернативные способы его реализации?

ответ

0

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

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

+0

Пользователь перешёл список элементов. Пользователь выбирает элемент из списка и редактирует его. Затем он/она сохраняет изменения или отменяет их. И позже, когда он закончит редактирование всех предметов, он может выбрать «Сохранить все» или «Отменить все». Для этой функции я должен обновлять базу данных только тогда, когда пользователь нажимает кнопку «Сохранить все». Для «промежуточных действий« Сохранить/Отменить »мне нужно создать копию объекта, если пользователь выберет« Отмена ». Пользователь также может редактировать один и тот же элемент более одного раза (отредактировать объект A, сохранить его, отредактировать объект B, сохранить его, а затем повторно отредактировать A и сохранить его). – exoz

+0

Если я вызываю обновление, я думаю, что объект снова получает значения из базы данных, тогда я проиграю предыдущие изменения. – exoz

+0

@exoz: Если вам нужна копия объекта, было бы лучше клонировать объект вручную (возможно, используя «Clobeable»), а не полагаться на Hibernate, чтобы сделать это. – axtavt

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