2012-10-05 51 views
3

我們使用Seam JBoss Seam 2.2.2最終版本,並在其中包含Hibernate 3.3.1.GA.我們在表上更新觸發器,以便在表上發生更新時,將舊記錄記錄在歷史記錄表中。禁用Hibernate 3上的透明持久化3

我們有一個包含填充實體的字段的頁面。當一個字段完成時,一個AJAX調用被調用到一個方法(在JSF中),它根據需要更新實體。問題在於,Hibernate將實體視爲已更改,並相應地更新數據庫表。這增加了歷史表。我們僅使用Hibernate使用JPA實現。

我的問題是:如何禁用Hibernate中的自動更新(稱爲透明持久性)?我們通過調用EntityManager.persist()EntityManager.merge()(在代碼中),我們想要顯式地保存實體。

感謝

回答

1

回答你的問題:

不更新的方法實體或離開方法之前清除了EntityManager。

我想這個答案,你需要:

不發送到數據庫的每項更改,但是用戶提交了他的更改後(如按鈕「保存」或「聚集所有更改,只更新持久化實體下一個「或類似的東西)。

+0

你誤解我了。 Hibernate會自動更新已更改的實體,我們不會執行'EntityManager.persist()'或'EntityManager.merge()'。這就是我們想要禁用的,也就是說,我們希望顯式** ** persist()或merge()更改的實體。 –

1

您可以圍繞您的頁面創建對話並使用​​。這有效地禁用刷新,直到你明確地執行它(例如在你的persist()方法中)。

這樣做的缺點是Hibernate必須是您的持久性提供程序,因爲手動刷新不是標準的JPA 1.0功能。因此Seams知道如何僅在Hibernate中使用它。至少對於包括2.2.x版在內的Seam版本來說,這是真實的。你現在使用Hibernate,所以這不應該是一個問題。

替代方案:

  1. 的頁面,而不是真正的實體對象上使用DTO對象。將實體克隆到DTO中並在持續之前更新實體。
  2. 使用EntityManager.clear()從會話中分離所有對象。