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

时间:2012-02-15 14:11:45

标签: hibernate jpa ejb seam

我遇到一种奇怪的情况,即将一些无状态EJB注入Stateful会阻止某些延迟属性被扩展持久化上下文解析为Seam 2.2.2中长时间运行的对话

从我发现的情况来看,似乎在无状态EJB的持久化上下文中执行的任何查找注入到有状态的中会导致在扩展持久化上下文中调用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);
        }
}

有人能证实我这个吗?

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:-1)

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