假设我有以下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没有区分 一个空集合引用和一个 空集合。
这很有道理,但我希望有人可以拿出一个狡猾的诡计来克服这个限制。我想也许一些监听器/回调机制可能允许我用空引用替换空列表。
答案 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中对它进行评估,这对你没有帮助。
两个想法:
@PostLoad / @PostConstruct
方法
这也是一样。