Hibernate中的Null与空集合

时间:2009-09-21 14:36:28

标签: java hibernate

假设我有以下Hibernate映射类:

public class ClassA {       
   @OneToMany(fetch=EAGER)
   private List<ClassB> bList;
}

当我从Hibernate会话中读取ClassA的对象时,bList字段会按照预期使用PersistentList对象进行初始化。

我发现自己有一个要求,即在列表为空的情况下,我需要Hibernate将bList字段初始化为null,而不是空PersistentList。从理论上讲,Hibernate拥有它所需要的信息,因为列表中的提取非常渴望。问题是根据section 6.1 of the Hibernate docs

  

由于潜在的关系   模型,集合值属性   不支持null值语义。   Hibernate没有区分   一个空集合引用和一个   空集合。

这很有道理,但我希望有人可以拿出一个狡猾的诡计来克服这个限制。我想也许一些监听器/回调机制可能允许我用空引用替换空列表。

3 个答案:

答案 0 :(得分:9)

您是否尝试过检查getbList()方法?你可以这样做:

if(bList.isEmpty()) 
    return null;
return bList;

Hibernate将始终为您的引用创建一个对象,但您可以控制getter和setter中的数据。如果列表包含0个元素,则始终可以返回null。

答案 1 :(得分:2)

我很好奇为什么你认为这是一个“限制” - null bList实际上对你的应用程序有不同的含义而不是空bList

我认为在大多数领域,null集合和空集合具有相同的语义含义,我猜这是为什么Hibernate开发人员试图将Hibernate限制为只使用一个。总是检查if (bList == null || bList.isEmpty)这两个总是最终意味着相同的东西没有多大意义。

答案 2 :(得分:2)

对于代码中的处理,显而易见的方法是在getter中,但如果你想在HQL中对它进行评估,这对你没有帮助。

两个想法:

  • 如果构造函数将其设置为NULL 空。
  • @PostLoad / @PostConstruct方法 这也是一样。