entityManager的范围可以达到多远?

时间:2014-11-29 01:07:10

标签: java jpa persistence java-ee-7

假设我有一个无状态会话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
    }
}      

1 个答案:

答案 0 :(得分:0)

取决于您的交易边界的管理方式。你在使用bean管理的交易吗?用REQUIRES_NEW管理容器?使用默认边界管理的容器?

我建议:

https://docs.oracle.com/javaee/5/tutorial/doc/bncij.html