我在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();
之间的任何操作对吗?
请让我知道我在哪里弄错了。
此致
答案 0 :(得分:1)
如果删除session.flush()
和session.close()
,您将发现没有执行插入语句。保证的要点是persist
调用本身不会执行任何语句;它没有说明flush
和close
行为的含义。实际上,flush
将所有持久对象刷新到数据存储区。
答案 1 :(得分:1)
这是古老的魔法!
if (getTransactionIsolation()==Connection.TRANSACTION_NONE
|| getAutoCommit()==true)
persist()忽略事务边界!
为什么呢? persist()不知道支持事务。在第二种情况下,它承诺,因为他没有预料到需要交易。