2008-10-29 20 views
0

我目前在使用Hibernate作爲持久性管理器和JPA作爲持久性管理休眠的抽象的java中開發應用程序。從數據庫中獲取對象時,JPA(Hibernate)如何處理事務

我想知道圍繞事務打包結果查詢的影響。我知道實體經理必須保持開放,懶惰地提取字段錯誤所有這些交易是什麼?

這裏是一個事務激活/去激活能力的代碼示例。

public List<Exportdata> get(Integer max, EntityManager em, Boolean withTransaction) { 
    EntityTransaction tx = null; 
    try { 
     if (withTransaction) { 
      tx = em.getTransaction(); 
      tx.begin(); 
     } 

     Query query = em.createQuery("from Exportdata"); 
     query.setMaxResults(10); 
     List<Exportdata> list = query.getResultList(); 

     if (withTransaction) 
      tx.commit(); 

     return list; 
    } catch (RuntimeException re) { 
     if (withTransaction) 
      if (tx != null && tx.isActive()) 
       tx.rollback(); 

     throw re; 
    } 
} 

當調用此函數時啓用或禁用withTransaction與區別?

感謝所有, 弗雷德

回答

5

沒有實際的區別就在這裏,因爲你沒有改變任何數據。您執行的查詢將生成一個SQL選擇。交易在那裏讓你ACID屬性適用於插入,更新的集合,等

然而,如果你開始操縱從該方法返回的列表中的對象,呼籲制定者,等等。這些變化會通過臨時的事務傳播回數據庫。換句話說,你將有效地在自動提交模式下使用數據庫。這不太可能是你想要的。

要了解的重要一點是持久性上下文和事務的持續時間可以分開管理。通常你會想一起管理它們。

+1

「如果您開始操作從此方法返回的列表中的對象,那麼這些更改將傳播回數據庫 - 特別是基於事務的事務。」這是否適用於關閉或兩種情況? – 2008-10-29 23:46:32

相關問題