Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA,来自另一个persistenceContext的实体作为搜索参数_Jpa_Entitymanager - Fatal编程技术网

JPA,来自另一个persistenceContext的实体作为搜索参数

JPA,来自另一个persistenceContext的实体作为搜索参数,jpa,entitymanager,Jpa,Entitymanager,我有两个实体: @Entity public class Entity1{} @Entity public class Entity2{ @OneToOne protected Entity1 e1; } 我有一个搜索Entity1的方法 Entity1 findEntity1(some args){ EntityManager em = this.emfp.getEntityManager();

我有两个实体:

    @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,因此也有自己的持久性上下文。
我可以在第二个方法中使用从第一个方法返回的e1吗?

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


您需要展开select查询并使用基本类型,如数字ID或字符串。

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


您需要展开select查询,并使用基本类型,如数字ID或字符串。

虽然您不能按照描述它的方式进行操作,但可以使用不同的持久性上下文,您可以对代码进行一些调整,有效地将实体放在同一上下文中。如果可以全部使用,则取决于堆栈:

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

对于JavaSE应用程序,您仍然可以使用事务-
UserTransaction
s。不过,您需要手动控制事务的范围

使用扩展的持久性上下文(从JPA2.0开始)。它只会显式地失效,因此在您这样说之前,所有获取的实体都将保留在上下文中

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

编辑:只要您停留在同一事务中,划分搜索的EJB数量并不重要。根据经验,事务在调用第一个EJB方法时开始,在该方法返回时结束。此方法调用的所有方法都将位于同一事务中。 不过,这种默认行为可能会改变-EJB方法的事务性由


@TransactionAttribute注释,因此只需沿着bean中的调用路径进行操作。

虽然您不能按照描述它的方式进行操作,但可以使用不同的持久性上下文对代码进行一些调整,从而有效地将实体放在同一上下文中。如果可以全部使用,则取决于堆栈:

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

对于JavaSE应用程序,您仍然可以使用事务-
UserTransaction
s。不过,您需要手动控制事务的范围

使用扩展的持久性上下文(从JPA2.0开始)。它只会显式地失效,因此在您这样说之前,所有获取的实体都将保留在上下文中

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

编辑:只要您停留在同一事务中,划分搜索的EJB数量并不重要。根据经验,事务在调用第一个EJB方法时开始,在该方法返回时结束。此方法调用的所有方法都将位于同一事务中。 不过,这种默认行为可能会改变-EJB方法的事务性由


@TransactionAttribute
注释,因此只需沿着bean的调用路径进行操作。

感谢您提供详细的答案。我使用EJB。所以@PersistenceContext是我的选择:)但是我还有一个问题-如果方法放在不同的类(不同的EJB)中,我就没有办法共享实体了吗?只发送基本数据(ID、某些int或String等)?@VictorMaxrin不客气。我已经添加了一些关于事务范围EJB的详细信息,希望它能给您一些适当的提示。事务性和持久性上下文有时是可以限定的。谢谢您的详细回答。我使用EJB。所以@PersistenceContext是我的选择:)但是我还有一个问题-如果方法放在不同的类(不同的EJB)中,我就没有办法共享实体了吗?只发送基本数据(ID、某些int或String等)?@VictorMaxrin不客气。我已经添加了一些关于事务范围EJB的详细信息,希望它能给您一些适当的提示。事务性和持久性上下文有时可以被限定。