我对某事感到好奇。我们假设我们在员工和电话之间有一个简单的关系:
@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 ?
答案 0 :(得分:3)
由于默认情况下这些集合是惰性的employee.getPhones()
,因此应返回该集合的代理(例如PersistentList
或类似代码),当您访问列表时,该代理会加载列表元素。
此外,因为Phone
是关系的所有者,Hibernate不知道是否有员工的电话,所以它必须假设列表存在 - 尽管可能< / em>是空的。也就是说,Hibernate返回null是没有意义的:
getPhones()
的延迟加载不能返回null但是代理使用急切加载不应该改变,因为虽然Hibernate会知道没有电话让员工在空列表表达时返回null但仍然没有意义(考虑允许为加载添加电话)员工,代码中的差异,如果使用null进行急切提取等,则不需要它们。)