2012-11-06 152 views
3

我的文檔閱讀:session.persist()方法混淆

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

交易是否啓用了連接? –

+0

NO。任何進一步的幫助呢? – user182944

+0

@ user182944你有答案嗎?請分享。 –

回答

1

如果刪除session.flush()session.close(),你會看到,沒有插入語句被執行。保證的一點是persist調用本身不會執行任何語句;它並沒有說關於flushclose行爲的含義。確實,flush將所有持久對象刷新到數據存儲。

+0

如果我刪除了你建議的兩行,那麼save()也不起作用。那麼兩者之間的區別在哪裏呢? – user182944

+0

'save'可能會或可能不會立即執行'insert'; 「persist」保證它不會。 –

+0

五月或可能不? 「可能」部分在什麼情況下出現?我嘗試了幾次,在所有情況下插入都沒有執行:( – user182944

1

這是古老的魔法!

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

persist()忽略事務邊界!

爲什麼? persist()不知道支持事務。第二種情況是因爲他沒有預期需要交易而承諾。