2015-10-13 49 views
10

我对某事很好奇。比方说,我们有一个简单的关系员工之间电话如果关系中的表为空,Hibernate是否返回null或空集合?

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

请问吸气retun NULL或空集,并会在getching战略中发挥作用。

如果我没有记错的话,hibernate有它自己的使用代理的集合的实现,并且对于获取,它实例化其中的一个,当需要的时候从表中检索数据(正确的如果我错了)。所以在调用getter的时候,试着从表中检索数据,得到一个空集合并返回一个空集合。 (这是我认为的)。或者我应该总是检查吸气剂的结果是否为NULL

+2

很可能是一个空的列表。返回'null'而不是空列表是一种不好的做法。 – Tunaki

+0

如果手机为空,您可以随时在您的获取方中进行检查并返回空列表 – arados

+0

是的,我将最终但无法访问我的笔记本电脑,并且一段时间都无法访问。正在和一些朋友讨论一些事情,我们需要知道。我知道这听起来很懒惰,但如果我现在可以检查它,我会...对不起 –

回答

3

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

此外,由于Phone是关系的所有者Hibernate不会知道是否有手机的员工或不那么它必须承担的列表中存在 - 尽管它可能是空的。这就是说,将没有多大意义,让Hibernate返回null因为:

  • 休眠需要首先尝试并加载手机看有没有
  • 实现集合getPhones()必须延迟加载不返回null,但代理
  • 返回null将是不好的做法无论如何(列表将仍然存在,它只是空的)
  • 如果列表为空,您不能添加电话,并让Hibernate使用级联等自动坚持这一变化(感谢Gimby指出)

使用急切加载不应该改变,因为尽管Hibernate会知道没有电话给员工返回null当一个空列表将表示仍然没有什么意义(考虑允许为加载的手机添加电话员工,代码中你不需要它们的区别,如果null用于提前提取等)。

相关问题