Hibernate: необходимо сохранить один и тот же объект дважды в транзакции - PullRequest
2 голосов
/ 18 августа 2011

Мне нужно сохранить один и тот же объект дважды в транзакции, но в hibernate всегда есть только одно обновление sql, есть ли способ сделать это?Вот код:

....
session.beginTransaction();
Student s = session.get(Student.class, id);

// (1) first save 
s.setSequenceNum(10);
session.saveOrUpdate(s);

// (2) second save
s.setSequenceNum(9);
session.saveOrUpdate(s);  // save again

session.getTransaction().commit();
session.close();

hibernate проигнорирует первый и будет иметь только одно обновление sql для второго.Как я могу позволить hibernate сделать оба обновления SQL?Мне это нужно, потому что это требование в нашем проекте.

Ответы [ 2 ]

9 голосов
/ 18 августа 2011

saveOrUpdate совершенно не требуется для прикрепленного экземпляра.Hibernate автоматически сохранит состояние присоединенного объекта

  • в конце транзакции
  • при выполнении запроса, результат которого может зависеть от нового состояния объекта
  • при явном вызове сброса в сеансе

Присоединенный объект - это объект, который вы извлекли из сеанса (из вызова для получения, загрузки или из запроса), или что у вас естьсделать постоянным через persist, save, update или merge (в этом последнем случае переданный объект не присоединяется, а возвращаемый объект есть).

Тогда почему saveOrUpdate полезен?Полезно сделать временный или отключенный объект постоянным, т. Е. Объект, который не присоединен к сеансу, либо потому, что он новый, либо потому, что он был присоединен ранее, но стал отсоединенным после закрытия сеанса.

ИдеяHibernate - сбросить измененное состояние (т.е. выполнить запрос SQL на обновление) только тогда, когда это необходимо, в самое позднее возможное время.Таким образом, он может избежать ненужных обновлений и, следовательно, сделать код более эффективным.Ваше первое обновление не требуется, если вы не выполняете собственный SQL-запрос в одной транзакции между двумя обновлениями.Почему вы хотите, чтобы промежуточное состояние сохранялось?

4 голосов
/ 18 августа 2011

Попробуйте session.flush () после первого обновления или установите session.setFlushMode (FlushMode.Always) перед первым обновлением.Помните, что setFlushmode повлияет на весь сеанс, если он будет повторно использоваться после транзакции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...