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

时间:2015-10-13 14:09:10

标签: java hibernate

我对某事感到好奇。我们假设我们在员工电话之间有一个简单的关系:

@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())
{
     ...
}

getter会重新调整NULL或空集合吗?getching策略是否会起作用。

如果我没记错的话,hibernate有自己的使用代理和 LAZY fetch的集合实现,它会用其中一个实例化,并在需要时从表中检索数据(正确如果我错了)。因此,在调用getter时尝试从表中检索数据,得到一个空集作为结果并返回一个空集合。 (这是我的想法)。或者我应该总是检查getter的结果是否 NULL

1 个答案:

答案 0 :(得分:3)

由于默认情况下这些集合是惰性的employee.getPhones(),因此应返回该集合的代理(例如PersistentList或类似代码),当您访问列表时,该代理会加载列表元素。

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

  • Hibernate需要首先尝试加载手机才能看到没有
  • 实现集合getPhones()的延迟加载不能返回null但是代理
  • 无论如何返回null都是不好的做法(列表仍然存在,它只是空的)
  • 如果列表为null,则无法添加电话,让Hibernate使用级联等自动保留更改(感谢Gimby指出)

使用急切加载不应该改变,因为虽然Hibernate会知道没有电话让员工在空列表表达时返回null但仍然没有意义(考虑允许为加载添加电话)员工,代码中的差异,如果使用null进行急切提取等,则不需要它们。)