2014-05-14 92 views
1

爲什麼我們總是需要在休眠時啓動一個事務來保存,插入,刪除或更新?爲什麼我需要在此添加交易?

hibernate中的默認自動提交功能是否爲false?

像這樣

public static void main(String[] args) { 
     System.out.println("creating empopbjects"); 
     emp e1=new emp("a","x",1234); 
     emp e2=new emp("b","y",324); 
     emp e3=new emp("c","z",23345); 
     System.out.println("saving emp objects.."); 
     Session s=myfactory.getsession(); 
     s.save(e1); 
     s.save(e2); 
     s.save(e3); 
     s.close(); 
     System.out.println("successfully saved"); 
    } 

這不會保存任何內容,而如果我加入交易則僅將其添加?爲什麼這樣呢?

public static void main(String[] args) { 
     System.out.println("creating empopbjects"); 
     emp e1=new emp("a","x",1234); 
     emp e2=new emp("b","y",324); 
     emp e3=new emp("c","z",23345); 
     System.out.println("saving emp objects.."); 
     Session s=myfactory.getsession(); 
     Transaction t =s.beginTransaction(); 
     s.save(e1); 
     s.save(e2); 
     s.save(e3); 
     t.commit(); 
     s.close(); 
     System.out.println("successfully saved"); 
    } 

回答

2

你的問題從one of the SO page明確的答案在這裏。

請看下面的代碼,這 訪問數據庫,而不 事務邊界:用JDBC配置

Session session = sessionFactory.openSession(); 
session.get(Item.class, 123l); 
session.close(); 

默認情況下,在Java SE環境 ,這是 如果你發生了什麼執行此 片段:

  1. 一個新的會話被打開。它在這個 點沒有獲得數據庫連接。
  2. 對get()的調用觸發SQL SELECT。會話現在從連接池獲取JDBC 連接。 默認情況下,休眠立即通過 關閉自動提交模式,此連接使用setAutoCommit(false)連接 。 這有效地啓動了JDBC 事務!
  3. SELECT在此JDBC事務中執行。會話關閉 ,連接返回 到池並由Hibernate發佈 - Hibernate在JDBC連接上調用close()。 未提交的交易會發生什麼?

這個問題的答案的問題是,「這取決於 !」 JDBC規範 不說有關未決 交易時關閉()調用 連接任何東西。發生什麼取決於 供應商如何實施 規範。例如,使用Oracle JDBC 驅動程序,調用 close()提交事務!當JDBC連接對象關閉 並且資源返回到 池時,大多數 其他JDBC供應商採用相同的路由 並回退任何未決事務 。

顯然,這不會是你執行的 的選擇問題,但這種變化看起來 :

Session session = getSessionFactory().openSession(); 
Long generatedId = session.save(item); 
session.close(); 

該代碼產生的INSERT語句 ,一個 事務內部執行這是從未承諾或 回滾。在Oracle上,這段 代碼永久插入數據;在 其他數據庫中,它可能不是。 (此 情況稍微更 複雜:INSERT語句將被執行 僅當識別符發生器 需要它。例如,可以從 無插入而得到的序列的 標識符值然後 持久實體被排隊。 。直到 沖洗時間插入 - 這從未發生 在此代碼的身份 策略需要立即INSERT 爲將要產生的值)

底線:使用expli。首次交易分界。

2

Hibernate會話是一個Unit of Work,和查詢過程中的沖洗時間(之前執行的任何查詢時,或者當您的當前正在執行的事務被提交時可能發生)僅執行。

自動提交只在SQL控制檯中有意義,並且在企業應用程序中不受歡迎。使用ORM工具時,您正在管理實體對象狀態轉換,而不是執行DML操作。只有在狀態轉換被轉換爲DML操作時纔會在刷新時間。

因此,儘管您可以在自動提交中編寫JDBC語句,但JPA不允許您這樣做。