我遇到一种奇怪的情况,即将一些无状态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);
}
}
有人能证实我这个吗?
答案 0 :(得分:0)
不幸的是,这是JPA实施中的一个错误:
An extended persistence context should not be propagated if there is no JTA transaction
答案 1 :(得分:-1)
不确定导致clear()
行为的原因。但是,虽然您可以在EJB组件中使用带有@EJB
和@PersistenceContext
的EJB3注入,但您应该使用@In
注入BeanB
和实体管理器以便拥有会话范围缝管理实体管理器在您的组件中传播。