使用容器管理的JPA持久性,容器管理的JTA事务和注入无状态本地会话bean的实体管理器,调用不支持事务的方法对实体的托管状态有什么影响?我已经读过这个:https://community.jboss.org/thread/183007和类似的线程,但如果它们都使用来自同一工厂的注入EM,那么PC是否会传播到NOT_SUPPORTED方法似乎有些含糊不清?
考虑一个bean的片段,它将检索一个项目,然后从另一个bean调用一个方法:
@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?
}
我从规范中无法弄清楚:
我在这里要完成的是将一个实体附加到一个我不希望作为事务的一部分的方法中。
答案 0 :(得分:0)
在nonTxMethod中,是处于分离状态的项目吗?应该是什么 如果我引用em会发生吗?
TransactionAttributeType.NOT_SUPPORTED只是告诉您方法不需要事务的一种方法,您将无法在EntityManager中调用persist,merge或remove。但你仍然可以调用其他方法,如em.find(Someclass.class,objectId)
。所以我认为该实体不处于分离状态。
如果调用了代码段中的方法,该怎么办? TransactionAttributeType.NOT_SUPPORTED?会是的状态 LeanBean中的任何一个方法中的项目?
这与以前完全相同。只要确保,只要您将TransactionAttributeType.NOT_SUPPORTED
放入调用方法,例如startHere()
,所有后续方法调用事务状态都将被暂停,如果您需要在任何后续调用中进行trasaction,则必须在该方法上明确指定TransactionAttributeType.REQUIRED
。
默认情况下,当您从EJB外部调用任何会话bean的方法时,请从JSP中自动启动trasaction,除非您明确指定不需要事务。