Intereting Posts
Использование facebook.authorize с Android SDK не вызывает onActivityResult Не удается получить изображения из папки WEB-INF, используя classLoader.getResourceAsStream () Где я могу загрузить фреймы Spring Framework без использования Maven? Доступ к версии проекта maven в конфигурационных файлах Spring Могу ли я получить MOXy для переименования элемента при генерации json? FATAL ERROR в собственном методе: JDWP Нет инициализированных транспортов, jvmtiError = AGENT_ERROR_TRANSPORT_INIT (197) Загрузка и обновление правил из базы данных в Drools 6 Пользовательский чертеж на карте Mapbox Canvas Есть ли простой способ сравнить экземпляры BufferedImage? JVMTI – как получить значение параметра метода от обратного вызова jfreechart падает при использовании Yahoo Finance Quotes Inject Mocks для объектов, созданных classами Factory Я хочу загрузить все JAR из моей папки проекта libs с Maven ConcurrentModificationException при использовании iterator и iterator.remove () Как загрузить двоичный файл с помощью URLConnection

hibernate session.save () не отражается в базе данных

Согласно моему пониманию в спящем режиме (пожалуйста, подтвердите)

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();