Согласно моему пониманию в спящем режиме (пожалуйста, подтвердите)
1- У вас есть session.close()
если вы получите его через getSessionFactory().openSession()
.
2- Нет необходимости в session.close()
если вы получите его getSessionFactory().getCurrentSession()
. Он автоматически закрывается после commit () .
3- @ 2 При использовании getSessionFactory().getCurrentSession()
мы должны делать все действия DB внутри активной транзакции, чтобы мы могли совершить () в конце.
4- Hibernate en-queues все операции сохранения, обновления и удаления и отправляет их на сервер базы данных только после операции flush () или совершения транзакции или закрытия сеанса, в котором происходят эти операции (в соответствии с javadoc)
Из приведенных выше пунктов, если я рассматриваю 1 & 4 , тогда следующий код должен работать:
Session session = HibernateUtil.getSessionFactory().openSession(); AccountDetails ac = new AccountDetails(); //perform set operations session.save(ac); session.close(); System.out.println("new account stored.");
НО он не работает, т.е. он работает гладко, но не отражает (хранит) в базе данных. Почему это так? Когда я пишу код внутри транзакции и фиксирую, он сохраняется.
Я думаю, что мне не хватает основной вещи. Просьба уточнить.
Когда вы создаете сеанс с помощью SessionFactory.openSession (), транзакция не создается, поэтому ваши операции выполняются вне контекста транзакции. Чтобы увидеть ваши изменения, вы должны начать новую транзакцию или выполнить свои операции как часть текущей транзакции. Из документации:
Типичная транзакция должна использовать следующую идиому:
Session sess = factory.openSession(); Transaction tx; try { tx = sess.beginTransaction(); //do some work ... tx.commit(); } catch (Exception e) { if (tx!=null) tx.rollback(); throw e; } finally { sess.close(); }
Да, session.save
не сохраняется в базе данных без транзакции. Единственный способ сделать это – использовать
true
Если это свойство используется, вам не нужна транзакция, и вам также не нужны session.flush()
или session.close()
Я также пытался понять суть: save () может выполнять операцию вставки за пределами границ транзакции, поэтому я сделал что-то вроде этого
SessionFactory factory = new Configuration().configure() .buildSessionFactory(); Session session = factory.openSession(); session.save(user); session.close();
Но данные не вставлены в базу данных. Так что я снова попробовал это и теперь это сработало для меня и данные вставили успешно:
в файле конфигурации:
true
и в java-коде:
SessionFactory factory = new Configuration().configure() .buildSessionFactory(); Session session = factory.openSession(); session.save(user); session.flush(); session.close();
session.close () несет ответственность только за закрытие сеанса https://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/Session.html#close ()
как работать с сеансом гибернации: https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/transactions.html#transactions-basics
// Non-managed environment idiom Session sess = factory.openSession(); Transaction tx = null; try { tx = sess.beginTransaction(); // do some work ... tx.commit(); } catch (RuntimeException e) { if (tx != null) tx.rollback(); throw e; // or display error message } finally { sess.close(); }
Как написано в документации: гораздо более гибкое решение – это встроенное контекстное управление Hibernate: «текущая сессия»:
// Non-managed environment idiom with getCurrentSession() try { factory.getCurrentSession().beginTransaction(); // do some work ... factory.getCurrentSession().getTransaction().commit(); } catch (RuntimeException e) { factory.getCurrentSession().getTransaction().rollback(); throw e; // or display error message }
Всякий раз, когда вы выполняете какую-либо единицу работы над объектами базы данных, транзакции должны использоваться. http://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/transactions.html показывает, почему они используются и как их можно использовать. Но ключ состоит в том, чтобы использовать объект transaction
, вызывая session.beginTransaction()
который возвращает объект Transaction
. Это будет представлять собой единицу работы, выполненную в базе данных.
Я обнаружил, что мне нужно было очистить, а затем обновить DAO, а затем это сработало.
session.flush() session.refresh(entityDAO)
if there is DB manipulation operation then it should be in transaction if you call session.save(object) hibernate create bellow query only . select hibernate_sequence.nextval from dual so right code is here Transaction t=session.beginTransaction(); session.save(obect); t.commit(); should not forgot to commit. session.close();