[英]State of jpa managed entity in surrounding transaction
JPA 2.x,容器管理的事務,容器管理的依賴項注入
偽代碼:
@Transactional(Required)
public class EJB1 {
@PersistenceContext
EntityManager em1;
@Inject
EJB2 ejb2;
public void callSecondEjb(){
MyEntity e = ejb2.returnEntity();
}
}
@Transactional(Requires_New)
public class EJB2 {
@PersistenceContext
EntityManager em2;
public MyEntity returnEntity(){
MyEntity e = new MyEntity();
em2.persist(e);
return e;
}
}
(上面的代碼是偽代碼。請不要對錯別字或其他東西挑剔。)
這個想法是,創建一個實體並將其保留在嵌套事務中。 據我所知,每個事務都有自己的EntityManager。 我的問題:周圍事務(此處為em1)的EntityManager是否將返回的實體視為托管或分離的實體?
一個密切相關的問題:(再次是偽代碼)
@Transactional(Required)
public class EJB1 {
@PersistenceContext
EntityManager em1;
@Inject
EJB2 ejb2;
public void callSecondEjb(){
MyEntity e = new MyEntity();
em1.persist(e);
ejb2.changeEntity(e);
e.setOtherValue(123);
}
}
@Transactional(Requires_New)
public class EJB2 {
@PersistenceContext
EntityManager em2;
public MyEntity changeEntity(MyEntity e){
em2.merge(e);
e.setValue(13);
}
}
第二個示例顯示了如何將托管實體從外圍事務移交給嵌套事務。 然后將實體合並到嵌套事務的PC中並進行更改。 在Java中,當我們處理對象時,我們會使用引用,因此em1和em2都會注意到所有更改。 在“ changeEntity(e)”的最后,提交嵌套事務。
問題:如果周圍的事務提交,是否會出現OptimisticLock異常,或者更改后的版本會傳播到em1? 如果將提交的版本暴露給實體(通過使用@Version注釋字段),行為會有所不同嗎?
Q1周圍事務(這里為em1)的EntityManager是否將返回的實體視為托管或分離的實體?
A1返回的實體是em1未知的。 將該實體視為已分離。
Q2如果周圍的事務提交,是否會出現OptimisticLock異常,還是將更改的版本傳播到em1?
A2沒有例外。 由於“按引用調用”,似乎所有更改對於em1都是已知的。
Q2b如果將提交的版本公開給實體(通過使用@Version注釋字段),行為會有所不同嗎?
A2b不知道。 我的示例暴露了版本字段。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.