Что делает Transactions.commit (), когда в Hibernate задан режим flushmode? - PullRequest
1 голос
/ 16 апреля 2010

Вот блок кода в книге «Сохранение Java» с книгой Hibernate Кристиана и Гэвина,

    
Session session = getSessionFactory().openSession();
session.setFlushMode(FlushMode.MANUAL);
// First step in the conversation
session.beginTransaction();
Item item = (Item) session.get(Item.class, new Long(123) );
session.getTransaction().commit();
// Second step in the conversation
session.beginTransaction();
Item newItem = new Item();
Long newId = (Long) session.save(newItem); // Triggers INSERT!
session.getTransaction().commit();
// Roll back the conversation!
session.close();//enter code here

Я запутался в том, почему первый шаг и второй шаг нужно заключить в две отдельные транзакции? Поскольку flushmode здесь установлен вручную, никакие операции (предположим, что мы игнорируем вставку здесь) все равно не попадут в базу данных. Так зачем здесь транзакции?

спасибо

Ответы [ 3 ]

1 голос
/ 16 апреля 2010

У вас всегда должна быть запущенная транзакция при использовании hibernate.

А вот что говорят документы о MANUAL:

Этот режим очень эффективен для транзакций только для чтения.

Что касается разговоров - предполагается, что они охватывают более одного метода ( читайте здесь ). Поэтому я не думаю, что ваш пример должен быть в одном методе.

Как написано в статье, на которую я ссылаюсь, транзакция должна быть "единицей работы". Если вы считаете это необходимым, используйте новую транзакцию. Но будь уверен, что это необходимо. В противном случае - не совершайте несколько транзакций за один запрос.

0 голосов
/ 16 апреля 2010

Как говорит @Bozho, это в основном полезно для транзакций только для чтения. Эти полезны . Они позволяют работать с одной и той же версией объекта для двух разных целей одновременно, не нанося вреда фактическим данным. В этом случае кэш Hibernate предоставит вам идентичные копии объекта и позволит вам делать с ними все, что вы захотите.

0 голосов
/ 16 апреля 2010

Я думаю, это из-за постоянных причин лучшей практики. Например на

Long newId = (Long) session.save(newItem);

Элемент newItem не будет сохранен в базе данных, пока транзакция не будет зафиксирована. И когда «получаю» экземпляр на

Item item = (Item) session.get(Item.class, new Long(123) );

транзакция зафиксирована, потому что get() извлечет постоянный объект. При фиксации транзакции item отсоединяется от транзакции и не будет сохраняться (пока не будет явно обновлено и сохранено снова).

Больше информации на вики

http://en.wikipedia.org/wiki/Object_database

http://en.wikipedia.org/wiki/Persistence_%28computer_science%29

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