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

レコードが挿入されています。上記のコードでわかるように、トランザクションは使用していません。その場合、ドキュメントによれば、データはDBに挿入されるべきではありませんか?

トランザクション境界は、 と の間の操作を意味しますTransaction tran = session.beginTransaction();tran.commit();?

どこで間違いを犯しているのか教えてください。

よろしく、

4

2 に答える 2

1

と を削除するsession.flush()session.close()、insert ステートメントが実行されていないことがわかります。その保証のポイントは、persist呼び出し自体がステートメントを実行しないことです。flushおよびの動作への影響については何も述べていませんclose。実際、flushすべての永続オブジェクトをデータストアにフラッシュします。

于 2012-11-06T12:16:11.513 に答える
1

これは古い魔法です !

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

persist() はトランザクション境界を無視します!

なんで?persist() はサポート トランザクションを認識していません。2番目のケースでは、トランザクションが必要になるとは思っていなかったため、コミットされました。

于 2012-11-12T08:15:55.553 に答える