2012-10-24 52 views
2

我正在試用JPA在獨立模式下(由Hibernate支持)。 我注意到下面的代碼更改數據庫值設置爲「亂碼」成功:JPA獨立模式 - 更改EntityTransaction外部的管理實體字段的工作原理 - 爲什麼?

A a = em.find(A.class, 1); 
a.setA1("garbled"); 
entityTransaction.begin(); // line 3 
entityTransaction.commit(); // line 4 
em.close();     

沒有其他交易()開始線3。 在API spec for EntityTransaction使用的語言似乎另有指示或可能的東西是有點反直覺的劃分與一個JPA實體交易開始的模型()提交()?請注意,行和是必要的,因爲註釋它們不會更改數據庫值。

+1

我同意這種行爲是違反直覺的(並且給出的答案是完全正確的),這就是爲什麼像DataNucleus JPA這樣的一些JPA實現提供了「原子」非事務操作,即「a.setA1( )「會立即進入數據存儲區(如JDBC中的」自動提交「),而不必啓動新的事務來獲取它。 – DataNucleus

回答

3

a在您的示例中是與em實例關聯的管理實體,可以在事務邊界之外進行修改,並且將作爲來自同一實體管理器實例的事務的一部分持久化。事務邊界只定義事務提交時進入數據庫的內容,以及在事務失敗時恢復對數據庫做出的更改。假設您的示例中的交易失敗,a仍然會進行更改,只是數據庫沒有這些更改,因此其他人不可見。

如果您期望受管實體不應在交易邊界之外修改,或者在事務邊界之外的任何更改不應持續存在,那就不是這樣。管理實體的生命週期與其實體管理者聯繫在一起。

+0

因此,對於數據庫而言,什麼是事務邊界內的內容以及對託管實體所做的任何更改? –

+0

是的,來自給定實體管理器的事務提交將該實體管理器的所有修改後的管理實體刷新到數據庫。 – Vikdor