Java JPA从实体中的集合获取值

Java JPA从实体中的集合获取值,java,jpa,jakarta-ee,persistence,Java,Jpa,Jakarta Ee,Persistence,我是JPA新手,现在遇到了一个问题 我有两个表Person和PersonAddress 在个人实体中,我有 @OneToMany(mappedBy="personid") private Set<Personaddress> personaddressCollection; @ManyToOne @JoinColumn(name="PERSONID") private Person personid; 我正在做一个类似于下面的查询: List<Person> pers

我是JPA新手,现在遇到了一个问题

我有两个表PersonPersonAddress

个人实体中,我有

@OneToMany(mappedBy="personid")
private Set<Personaddress> personaddressCollection;
@ManyToOne
@JoinColumn(name="PERSONID")
private Person personid;
我正在做一个类似于下面的查询:

List<Person> personlist = em.createQuery("SELECT e FROM Person e").getResultList();
List personlist=em.createQuery(“从人e中选择e”).getResultList();
我希望它返回Person表中的所有数据以及Person实体中可用的集合中PersonalAddress表中的数据。 personlist的大小是正确的,但是当我尝试读取PersonalAddress集合时,得到的是空值。但是数据库中有值,不能为null

对应于每个合作伙伴,将有一个PartnerAddress,该地址将不为空。 如果到目前为止我所做的一切都是错误的,我如何向JPA提出质疑

请帮忙

我希望它返回Person表中的所有数据以及Person实体中可用的集合中PersonalAddress表中的数据

默认情况下,
OneToMany
LAZY
,因此
SELECT e FROM Person e
不会加载相关地址的集合

如果要更改此行为,请执行以下操作之一:

@OneToMany(mappedBy="personid", fetch=FetchType.EAGER)
private Set<Personaddress> personaddressCollection;
使用后一种方法,当您不需要地址时,仍然可以从延迟加载中获益。前一种方法“全局地”改变行为

personlist的大小是正确的,但是当我尝试读取PersonalAddress集合时,得到的是空值。但是数据库中有值,不能为null

这在某种程度上是“另一个”问题。我的建议是激活SQL语句的日志记录,以查看到底执行了什么查询,以及为什么没有获得相应的地址。数据一定有问题

工具书类
  • JPA1.0规范
    • 第9.1.24节“OneToMany注释”
    • 第4.4.5.3节“获取连接”

如果可能(即类大小很小),您可以发布Person和PersonalAddress的完整类吗?不是答案,而是两个技巧:1)初始化集合(例如
new HashSet()
),这可以防止NPE和2)不为集合本身提供setter,您的客户端可以直接修改getter返回的集合。您的JPA提供程序可能已经注入了一个优化的集合实现,您应该使用它。文件如下—“OneToMany在默认情况下是惰性的,因此从Person e中选择e不会加载关联地址的集合。”:第一部分是正确的,但第二部分不是。集合被加载,只是加载延迟到调用getter方法。这由集合的getter上的代理对象处理。因此,fetch策略中不可能存在导致返回空值的错误。记录SQLs的建议肯定会对OP有所帮助。我要求提供完整的类列表,因为我认为类-实体关系没有被正确识别。@Vinet我不是这么说的。我将问题的第一部分解释为“我希望它返回Person表中的所有数据以及Person实体中可用集合中PersonalAddress表中的数据”,这就是为什么我写了几句关于OneToMany默认懒惰的话。但我并没有写到这会导致获取
null
,而是明确地写到这是“另一个”问题。换句话说,也许第一部分超出了OP的要求,但我仍然认为我的答案是正确的,你在读我没说的东西。“Pascal,我的坏家伙。我只能不好意思地道歉:-@Vinet没问题,别担心。也许我的答案并不清楚。我将在更新之前等待OP的一些反馈。我选择了从Person e LEFT JOIN FETCH e.PersonalAddressCollection中选择e。现在工作正常了。可能是因为我在尝试一些东西,并在插入后立即执行了查询。我把它们分开,再试一次,效果很好。。!谢谢你的帮助!
@OneToMany(mappedBy="personid", fetch=FetchType.EAGER)
private Set<Personaddress> personaddressCollection;
SELECT e FROM Person e LEFT JOIN FETCH e.personaddressCollection