假设我有一个无状态会话bean,Foo。我已经使用CDI将一个EntityManager注入到Foo中。
我已经读过,默认情况下,EntityManager将是事务范围的,因此EntityManager的持久化上下文中的任何实体都将由EntityManager管理,直到事务结束。
但是,如果交易在Foo之外,在Bar类中开始怎么办?所以Foo已被注入Bar,交易从Bar开始,然后在该交易中调用Foo。当然,EntityManager在创建Foo之前无法管理对象,但是在Foo中的方法返回之后怎么办呢?
在Foo返回之后,EntityManager是否仍以某种方式管理它在Foo中管理的实体,或者即使事务仍在继续,它们在那时已被分离?如果我在Foo中的方法返回后更改了Bar中实体的值,那么该更改是否应该传播到数据库?
非常感谢!
编辑:一些代码使其更清晰
class Bar {
@Inject
Foo foo;
// Transaction starts here
public void doSomething(){
foo.doSomethingElse();
// Transaction is still uncommitted here
// Make a change to an entity here that was in foo's
// entityManager's persistence context
// Does it get picked up and propagated to the db?
// Or is the entityManager gone by this point?
}
// Transaction commits after return of this method
}
@Stateless
class Foo {
@PersistenceContext
EntityManager em;
// This method by default joins the transaction that was already started in Bar
public void doSomethingElse(){
// Do something with entities
}
}
答案 0 :(得分:0)
取决于您的交易边界的管理方式。你在使用bean管理的交易吗?用REQUIRES_NEW管理容器?使用默认边界管理的容器?
我建议: