session.persist()方法混淆

时间:2012-11-06 12:10:06

标签: java hibernate

我在doc中看到了这个:

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();之间的任何操作对吗?

请让我知道我在哪里弄错了。

此致

2 个答案:

答案 0 :(得分:1)

如果删除session.flush()session.close(),您将发现没有执行插入语句。保证的要点是persist调用本身不会执行任何语句;它没有说明flushclose行为的含义。实际上,flush将所有持久对象刷新到数据存储区。

答案 1 :(得分:1)

这是古老的魔法!

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

persist()忽略事务边界!

为什么呢? persist()不知道支持事务。在第二种情况下,它承诺,因为他没有预料到需要交易。