Подтвердить что ты не робот

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.");

НО он не работает, то есть он работает плавно, но не отражает (сохраняет) в базе данных. Почему это так? Когда я пишу код внутри транзакции и фиксирую, он сохраняется.

Я думаю, что у меня нет основной вещи. Просьба уточнить.

4b9b3361

Ответ 1

При создании сеанса с использованием 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();
 }

Ответ 2

Я также пытался понять суть: save() может выполнять операцию вставки вне границы транзакции, поэтому я сделал что-то вроде этого

SessionFactory factory = new Configuration().configure()
                    .buildSessionFactory();
            Session session = factory.openSession();

            session.save(user);

            session.close();

Но данные не вставлены в базу данных. Поэтому я снова попробовал это и теперь это сработало для меня и данные вставлены успешно:

в файле конфигурации:

  <property name="connection.autocommit">true</property>

и в java-коде:

    SessionFactory factory = new Configuration().configure()
            .buildSessionFactory();
    Session session = factory.openSession();

    session.save(user);

    session.flush();
    session.close();

Ответ 3

Да session.save не сохраняется в базе данных без транзакции. Единственный способ сделать это - использовать

<property name="connection.autocommit">true</property>

Если это свойство используется, вам не нужна транзакция, а также вам не нужны session.flush() или session.close()

Ответ 4

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
}

Ответ 5

Всякий раз, когда вы выполняете какую-либо единицу работы над объектами базы данных, транзакции должны использоваться. http://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/transactions.html показывает, почему они используются и как их можно использовать. Но ключ состоит в том, чтобы использовать объект transaction, вызывая session.beginTransaction(), который возвращает объект transaction. Это будет представлять собой единицу работы, выполненную в базе данных.

Ответ 6

Я обнаружил, что мне нужно было очистить, а затем обновить DAO, а затем он сработал.

session.flush()
session.refresh(entityDAO)

Ответ 7

Вы забыли совершить. Вы должны совершить.

session.save(ac);
// you should to add this bottom line  
session.getTransaction().commit();

Ответ 8

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