2012-02-15 43 views
3

我遇到了一種奇怪的情況:將一些無狀態EJB注入到Stateful中,以防止某些懶惰屬性被擴展持久性上下文解析爲Seam中長時間運行的對話2.2.2將@Stateless Ejb注入具有擴展持久性的@Stateful上下文

從我發現的情況看,在無狀態EJB的持久化上下文中執行的任何查找都會注入到有狀態的EJB中,導致在Extended Persistence上下文中調用clear()方法。

的方法被標註了@TransactionAttribute(TransactionAttributeType.SUPPORTS)

例子:

@Stateful 
@TransactionAttribute(TransactionAttributeType.SUPPORTS) 
public class BeanA { 
     @PersistenceContext(type = PersistenceContextType.EXTENDED) EntityManager em; 
     @EJB BeanB beanB; 

     public MyClassA find(Long id) { 
      return em.find(MyClassA.class, id); 
     } 

     public void method() { 
      MyClassA a = find(2); 
      em.contains(a); // true 
      beanB.find("myId"); // Now every object returned from A's EM are detached. 
      em.contains(a); // false 
     } 
} 

@Stateless 
@TransactionAttribute(TransactionAttributeType.SUPPORTS) 
public class BeanB { 
     @PersistenceContext EntityManager em; 

     public MyClassB find(String id) { 
      return em.find(MyClassB.class, id); 
     } 
} 

任何人都可以證實我這個?

回答

-1

不確定導致clear()行爲的原因。但是,儘管您可以在EJB組件中使用@EJB@PersistenceContext的EJB3注入,但應該使用@In來注入BeanB和實體管理器,以便讓對話作用域將接口管理的實體管理器在組件中傳播。

+0

第一:很明顯(),不乾淨(),和你說什麼,它只是簡單的錯誤:你可以注入一個擴展持久化上下文使用普通的EJB,檢查接縫文檔。 – 2012-02-16 09:46:51