31

根据我在hibernate中的理解(请确认)

1-session.close()如果你得到它,你必须这样做getSessionFactory().openSession()。2-如果您得到它,则
无需。它在commit()之后自动关闭。 session.close()getSessionFactory().getCurrentSession()

3- @2使用时getSessionFactory().getCurrentSession(),我们必须在活动事务中执行所有数据库活动,以便我们可以在最后提交()。

4- Hibernate 对所有保存、更新和删除操作进行排队,并仅在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.");

但是它不工作,即它运行平稳但没有反映(存储)在数据库中。为什么会这样?当我在事务中编写代码并提交时,它就会被存储。

我想我错过了一个基本的东西。请说清楚。

4

9 回答 9

20

当您使用 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();
 }
于 2013-04-29T10:10:23.420 回答
6

我也试图理解这一点: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();
于 2014-10-12T19:39:31.340 回答
6

session.save的,没有交易就不会保存到数据库中。唯一的方法是使用

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

如果使用此属性,您不需要交易,也不需要session.flush()session.close()

于 2015-08-27T02:07:59.340 回答
3

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
}
于 2016-09-06T06:00:05.423 回答
1

每当您对数据库对象执行任何工作单元时,都必须使用事务。http://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/transactions.html显示了为什么使用它们以及如何使用它们。但是,关键是transaction通过调用session.beginTransaction()which 返回一个对象来使用一个Transaction对象。这将代表对数据库执行的工作单元。

于 2013-04-29T10:29:18.377 回答
1

我发现我必须刷新然后刷新 DAO,然后它就起作用了。

session.flush()
session.refresh(entityDAO)
于 2016-09-07T18:44:37.930 回答
1

你忘了承诺。你应该承诺。

session.save(ac);
// you should to add this bottom line  
session.getTransaction().commit();
于 2019-05-04T17:48:36.667 回答
0

每当您执行 save() 时,始终提交完成后的事务。

Account ac =new account()
ac.insert(123);
----------
----------
----------
----------
session.save(ac);

// Add this bottom line  
session.getTransaction().commit();
于 2019-11-14T08:43:38.780 回答
-2
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();
于 2018-09-09T04:32:37.080 回答