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-查询多个oneToMany_Jpa - Fatal编程技术网

JPA-查询多个oneToMany

JPA-查询多个oneToMany,jpa,Jpa,我想从数据库中选择一个实体Person(带Hibernate的JPA)个人有两个(或更多)一对一关系,例如地址和电话 如何完全恢复个人的实例以及地址和电话的所有相关实体。例如,联络人有两个地址和三部电话 (我可以用一个命令持久化Person的实例,但如何加载它?) 结果:两个列表均未初始化 第二种方式: @NamedQuery(name="PersonAddressesPhones", query = "SELECT p FROM Person p " + "lef

我想从数据库中选择一个实体
Person
(带Hibernate的JPA)<代码>个人有两个(或更多)一对一关系,例如
地址
电话

如何完全恢复
个人
的实例以及
地址
电话
的所有相关实体。例如,联络人有两个地址和三部电话

(我可以用一个命令
持久化
Person
的实例,但如何加载它?)

结果:两个列表均未初始化

第二种方式:

@NamedQuery(name="PersonAddressesPhones", 
   query = "SELECT p FROM Person p " +
           "left join fetch p.addresses " +
           "left join fetch p.phones " +
           "WHERE p.id = :id")
结果:这会导致异常:
org.hibernate.loader.MultipleBagFetchException:无法同时提取多个行李

您可以在
@OneToMany
中指定
fetch=FetchType.EAGER
。 当您对个人id执行
查找
时,这将获取与
个人
相关的所有电话、地址实体

但这不是一个好主意。最好只在需要时提取数据。有些备选方案是:

  • 保持原样(默认情况下,对于
    @OneToMany
    ,fetch类型为lazy),只需调用getter即可 在需要时按需填写集合(只要您的会话是 (未关闭)

  • 您可以编写一个(命名的)查询,该查询将使用它的 关联实体


  • 您可以在
    @OneToMany
    中指定
    fetch=FetchType.EAGER
    。 当您对个人id执行
    查找
    时,这将获取与
    个人
    相关的所有电话、地址实体

    但这不是一个好主意。最好只在需要时提取数据。有些备选方案是:

  • 保持原样(默认情况下,对于
    @OneToMany
    ,fetch类型为lazy),只需调用getter即可 在需要时按需填写集合(只要您的会话是 (未关闭)

  • 您可以编写一个(命名的)查询,该查询将使用它的 关联实体


  • 我尝试了第一个建议(打电话给getter)。但连接似乎立即关闭(在wildfly服务器上运行)。我已经在使用第二个建议,但这不允许我同时获得两个ArrayList。然后hibernate抛出一个异常:
    org.hibernate.loader.MultipleBagFetchException:无法同时提取多个行李
    您能在原始问题中发布这两个包的代码吗?我尝试了第一个建议(调用getter)。但连接似乎立即关闭(在wildfly服务器上运行)。我已经在使用第二个建议,但这不允许我同时获得两个ArrayList。然后hibernate抛出一个异常:
    org.hibernate.loader.MultipleBagFetchException:无法同时提取多个行李
    您能在原始问题中发布这两个行李的代码吗?这是一个hibernate特有的问题,经常出现。有关详细信息,请参阅。不幸的是,对于第二种工作方法,您必须处理hibernate问题(我没有看到这一点)。首先,我认为您需要在
    @ManyToOne
    映射上定义
    @JoinColumn
    注释来表示所有权。Ref:这是一个经常出现的特定于hibernate的问题。有关详细信息,请参阅。不幸的是,对于第二种工作方法,您必须处理hibernate问题(我没有看到这一点)。首先,我认为您需要在
    @ManyToOne
    映射上定义
    @JoinColumn
    注释来表示所有权。裁判:
    @Stateless
    public class PersonManager {
    
    @PersistenceContext
    private EntityManager em;
    
    public Person getPerson(int id) {
       Person person = em.find(Person .class, id);
       person.getAddresses ();
       person.getPhones();
       return person;
    }
    
    @NamedQuery(name="PersonAddressesPhones", 
       query = "SELECT p FROM Person p " +
               "left join fetch p.addresses " +
               "left join fetch p.phones " +
               "WHERE p.id = :id")