簡體   English   中英

JPA管理實體在周邊交易中的狀態

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM