Java 如果关系中的表为空,Hibernate是否返回null或空集合?

Java 如果关系中的表为空,Hibernate是否返回null或空集合?,java,hibernate,Java,Hibernate,我有点好奇。假设员工和电话之间有一个简单的关系: getter会重新运行NULL还是空集合,getching策略也会起作用 如果我没记错的话,hibernate有它自己的使用代理的集合实现,对于延迟获取,它使用其中一个进行实例化,并在需要时从表中检索数据(如果我错了,请更正)。因此,在调用getter时,尝试从表中检索数据,得到一个空集合作为结果,并返回一个空集合。(我就是这么想的)。或者我应该始终检查getter的结果是否为NULL吗?因为这些集合在默认情况下是惰性的employee。getP

我有点好奇。假设员工和电话之间有一个简单的关系:

getter会重新运行NULL还是空集合,getching策略也会起作用


如果我没记错的话,hibernate有它自己的使用代理的集合实现,对于延迟获取,它使用其中一个进行实例化,并在需要时从表中检索数据(如果我错了,请更正)。因此,在调用getter时,尝试从表中检索数据,得到一个空集合作为结果,并返回一个空集合。(我就是这么想的)。或者我应该始终检查getter的结果是否为NULL吗?

因为这些集合在默认情况下是惰性的
employee。getPhones()
应该为该集合返回一个代理(例如
PersistentList
或类似的),该代理在访问列表时加载列表元素

此外,由于
Phone
是关系的所有者,Hibernate不知道是否有员工的电话,因此它必须假设列表存在,尽管它可能是空的。也就是说Hibernate返回null没有多大意义,因为:

  • Hibernate需要先尝试加载手机,以查看是否没有
  • 要实现集合的延迟加载,
    getPhones()
    必须不返回null,而是返回一个代理
  • 不管怎样,返回null都是不好的做法(列表仍然存在,只是空的)
  • 如果列表为空,则无法添加电话,并让Hibernate使用级联等自动保持更改(感谢您指出这一点)

使用即时加载不应该改变这一点。Hibernate知道员工没有电话,但返回null而不是空列表(这也表示没有电话)仍然没有意义(考虑允许为已加载的员工添加电话,如果null用于紧急抓取,则代码中不需要电话的差异,等等).

很可能是一个空列表。返回
null
而不是空列表是一种不好的做法。如果手机为空,你可以随时检查getter并返回空列表。是的,我最终会返回空列表,但不幸的是,我现在无法访问笔记本电脑,并且一段时间内无法访问。我在和一些朋友讨论一些事情,我们需要知道。我知道这听起来很懒,但如果我现在能检查一下,我会。。。Sorry这似乎是其中一种情况,回答这个问题的最佳方法就是尝试一下,看看会发生什么。将数组初始化为实体中的实例变量也是一种很好的做法:private List phones=new ArrayList();所以你知道你阻止了npe
@Entity
public class Employee {
  @Id
  @Column(name="EMP_ID")
  private long id;
  ...
  @OneToMany(mappedBy="owner")
  private List<Phone> phones;
  ...
}
@Entity
public class Phone {
  @Id
  private long id;
  ...
  @ManyToOne(fetch=FetchType.LAZY)
  @JoinColumn(name="OWNER_ID")
  private Employee owner;
  ...
}
for (Phone phone : employee.getPhones())
{
     ...
}