1

我有两个实体:

    @Entity
    public class Entity1{}

    @Entity
    public class Entity2{
        @OneToOne
        protected Entity1 e1;
    }

我有一种方法可以搜索 Entity1

    Entity1 findEntity1(some args){
        EntityManager em = this.emfp.getEntityManager();
        //perform search
        return e1;
    }

我用这个方法找到Entity2

    Entity2 findEntity2(some args){
        EntityManager em = this.emfp.getEntityManager();
        e1 = findEntity1(args);
        //perform search using e1 :  Entity2.e1 = e1
        return e2;
    }

每个方法都有它自己的 EntityManager,因此它有自己的 Persistence 上下文。我可以在我的第二种方法中使用从第一种方法返回的 e1 吗?

4

2 回答 2

1

虽然您无法按照描述的方式进行操作 - 具有不同的持久性上下文,但您可以对代码进行一些调整,从而有效地将实体置于相同的上下文中。是否可以使用所有这些取决于您的堆栈:

对于 Java EE 应用程序,从会话 bean 开始搜索并使用容器管理EntityManager- 这会将持久性上下文包装在事务中,并且两个实体将在事务期间保持在相同的上下文中。

对于 Java SE 应用程序,您仍然可以使用事务 - UserTransactions。不过,您需要手动控制事务的跨度。

使用 EXTENDED 持久性上下文(自 JPA 2.0 起)。它只会显式失效,因此所有获取的实体都将保留在上下文中,直到您这么说。

对于所有这些解决方案,您需要更改EntityManager检索。@PersistenceContext在 Java EE 上下文中 使用注解并在 SE 上下文@PersistenceUnit中检索EntityManagerFactory

编辑:只要您留在同一个事务中,您划分搜索的 EJB 数量无关紧要。根据经验,事务在调用第一个 EJB 方法时开始,并在此方法返回时结束。此方法调用的所有方法都将在同一个事务中。不过,这种默认行为可能会改变——EJB 方法的事务性由 @TransactionAttribute注释定义,因此只需沿着 bean 遵循调用路径即可。

于 2012-11-12T15:50:05.070 回答
0

不,您不能使用来自不同持久性上下文的实体。

您需要扩展选择查询并使用基本类型,例如数字 ID 或字符串。

于 2012-11-12T15:39:04.620 回答