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")