我有一个使用Hibernate映射的组件。如果数据库中组件中的所有字段都为null,则hibernate将组件本身设置为null。这是预期的行为,也是我需要的行为。
我遇到的问题是,当我向该组件添加一个包时,该包被初始化为一个空列表。这意味着组件具有非空值...导致组件被创建。
知道如何解决这个问题吗?
<class name="foo.bar.Entity" table="Entity">
<id name="id" column="id">
<generator class="native" />
</id>
<property name="departure" column="departure_time" />
<property name="arrival" column="arrival_time" />
<component name="statistics">
<bag name="linkStatistics" lazy="false" cascade="all" >
<key column="entity_id" not-null="true" />
<one-to-many class="foo.bar.LinkStatistics" />
</bag>
<property name="loggedTime" column="logged_time" />
...
</component>
Restirctions.isNull(“statistics”)的标准确实会返回预期值。
答案 0 :(得分:1)
这里的基本问题是Hibernate无法区分空集合和空集合,因此它将它们都视为空:非空。
我建议您将统计信息组件更改为实体。然后你的foo.bar.Entity类有一个引用,可以为null。这并不理想,因为你必须创建另一个表来存储Statistics实体,但是如果你想要null与空语义的区别,那就是获得它的方法。
答案 1 :(得分:0)
我无法验证这一点,但这是一个想法:
public void setListProperty(List list) {
if (list == null || list.size() == 0) {
this.listProperty = null;
} else {
this.listProperty = list;
}
}
显然不理想,但可能是你的解决方法......
答案 2 :(得分:0)
也许这可以帮助。它不能解决区分null和空袋的问题,但它是一种解决方法。 您可能知道可以在会话中引入拦截器,可以拦截某些操作,如保存或更新实体,然后您可以使用此拦截器检查组件的状态,如果它是空的,则再次将其设为null,以便hibernate赢得'保存空值。 here是文档。