3

我在文档中读到了这个:

persist() also guarantees that it will not execute an INSERT statement if it is called outside of transaction boundaries.

但是当我尝试这段代码时:

SessionFactory sessionFactory = new Configuration().configure("student.cfg.xml").buildSessionFactory();
    Session session = sessionFactory.openSession();
    Student student = new Student();
    student.setFirstName("XXX");
    student.setLastName("YYY");
    student.setCity("ZZZ");
    student.setState("PPP");
    student.setCountry("XXX");
    student.setId("NNN");
    session.persist(student);       
    session.flush();
    session.close();

正在插入记录。正如您在上面的代码中看到的,我没有使用任何事务。那么在那种情况下,根据文档,数据不应该插入数据库中吗?

事务边界是指之间的任何操作Transaction tran = session.beginTransaction();tran.commit();对吗?

请让我知道我在哪里犯了错误。

问候,

4

2 回答 2

1

这是古老的魔法!

if (getTransactionIsolation()==Connection.TRANSACTION_NONE
   || getAutoCommit()==true)

persist() 忽略事务边界!

为什么?persist() 不知道是否支持事务。在第二种情况下,它已提交,因为他不希望需要交易。

于 2012-11-12T08:15:55.553 回答
1

如果您删除session.flush()and session.close(),您将观察到没有执行任何插入语句。该保证的重点是persist调用本身不会执行任何语句。它没有说明对flushand的行为的影响close。实际上,flush将所有持久对象刷新到数据存储区。

于 2012-11-06T12:16:11.513 回答