Hibernate 使用扩展持久性上下文将@Stateless Ejb注入@Stateful

Hibernate 使用扩展持久性上下文将@Stateless Ejb注入@Stateful,hibernate,jpa,ejb,seam,Hibernate,Jpa,Ejb,Seam,我遇到了一个奇怪的情况,在Seam 2.2.2中,将一些无状态EJB注入到有状态中会阻止扩展持久性上下文将一些惰性属性解析到长时间运行的对话中 从我发现的情况来看,似乎在注入有状态EJB的无状态EJB的持久性上下文中执行的任何查找都会导致在扩展持久性上下文中调用clear()方法 这些方法用@TransactionaAttribute(TransactionaAttribute.SUPPORTS)注释 例如: @Stateful @TransactionAttribute(Transaction

我遇到了一个奇怪的情况,在Seam 2.2.2中,将一些无状态EJB注入到有状态中会阻止扩展持久性上下文将一些惰性属性解析到长时间运行的对话中

从我发现的情况来看,似乎在注入有状态EJB的无状态EJB的持久性上下文中执行的任何查找都会导致在扩展持久性上下文中调用clear()方法

这些方法用@TransactionaAttribute(TransactionaAttribute.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);
        }
}

有人能证实我这一点吗?

不确定是什么导致了
clear()
行为。但是,虽然您可以在EJB组件中使用带有
@EJB
@PersistenceContext
的EJB3注入,但您应该使用
@in
注入
BeanB
和实体管理器,以便将会话范围的seam管理实体管理器传播到您的组件中。

,这是JPA实现中的一个bug:

首先:它是clear(),而不是clean(),而您所说的完全错误:您可以使用普通EJB注入扩展持久性上下文,请查看seam文档。