Java EJB3容器管理的持久性-实体何时变为非托管
对于容器管理的JPA持久性、容器管理的JTA事务以及注入无状态本地会话bean的实体管理器,调用不支持的事务方法对实体的托管状态有什么影响?我读过这篇文章:和类似的线程,但是如果PC都使用来自同一工厂的注入式EMs,那么PC是否会传播到不受支持的方法似乎有些模糊 考虑以下来自一个bean的片段,该bean将检索一个项,然后从另一个bean调用一个方法:Java EJB3容器管理的持久性-实体何时变为非托管,java,jpa,transactions,ejb-3.0,jta,Java,Jpa,Transactions,Ejb 3.0,Jta,对于容器管理的JPA持久性、容器管理的JTA事务以及注入无状态本地会话bean的实体管理器,调用不支持的事务方法对实体的托管状态有什么影响?我读过这篇文章:和类似的线程,但是如果PC都使用来自同一工厂的注入式EMs,那么PC是否会传播到不受支持的方法似乎有些模糊 考虑以下来自一个bean的片段,该bean将检索一个项,然后从另一个bean调用一个方法: @PersistenceContext private EntityManager em; @Inject private LeanBean l
@PersistenceContext
private EntityManager em;
@Inject
private LeanBean leanBean;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void startHere() {
MyItem item = em.find(MyItem.class, key);
leanBean.txMethod(item);
leanBean.nonTxMethod(item);
}
现在是LeanBean.java。请注意,它的两个方法具有不同的事务传播
@Stateless
@LocalBean
public Class LeanBean {
@PersistenceContext
private EntityManager em;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void txMethod(MyItem item) {
doSomething(item); // item is managed; persistence context propagated with
} // transaction context; em is the same as my caller's em
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void nonTxMethod(MyItem item) {
doSomething(item); // caller's transaction context has been suspsended.
} // did em propagate? is item managed?
}
我无法从规范中理解的内容:
em.find(Someclass.class,objectId)
。所以我认为这个实体不是处于分离状态
如果调用代码段中的方法被注释了呢
不支持TransactionAttributeType?将是
在LeanBean中的任何一个方法中
这将与前面的工作方式完全相同。只要确保在调用方法例如startHere()
中放置TransactionAttributeType.NOT\u SUPPORTED
时,所有后续方法调用事务状态都将被挂起,如果您需要在任何后续调用中进行传输,则必须在该方法上方明确指定TransactionAttributeType.REQUIRED
默认情况下,当您从EJB外部(更不用说从JSP)调用任何会话bean的方法时,除非您明确指定不需要事务,否则事务将自动启动。更具体地说,如果在非Xmethod内部,我试图访问MyItem的延迟获取字段。。。。