代码之家  ›  专栏  ›  技术社区  ›  skaffman

休眠中的空集合与空集合

  •  9
  • skaffman  · 技术社区  · 15 年前

    假设我有以下Hibernate映射类:

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

    当我读到 ClassA 在休眠会话中, bList 字段初始化为 PersistentList 对象,如预期的那样。

    我发现自己有一个要求,在列表为空的情况下,我需要休眠来初始化 布莱斯特 字段到 null 而不是空的 持久列表 . 从理论上讲,Hibernate拥有执行此操作所需的信息,因为列表中的获取是非常迫切的。问题是根据 section 6.1 of the Hibernate docs :

    由于潜在的关系 模型,集合值属性do 不支持空值语义。 休眠不区分 空集合引用和 空集合。

    这是完全有道理的,但我希望有人能想出一个狡猾的计谋来克服这个限制。我在想,也许某些侦听器/回调机制允许我用空引用替换空列表。

    3 回复  |  直到 15 年前
        1
  •  9
  •   amischiefr    15 年前

    您是否尝试签入getblist()方法?你可以这样做:

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

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

        2
  •  2
  •   matt b    15 年前

    我很好奇为什么你认为这是一个“限制”——是一个空的 bList 其实有一个不同的 意思 给你的申请比一个空的 布莱斯特 ?

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

        3
  •  2
  •   Damo    15 年前

    对于在代码中处理,很明显的方法是在getter中,但是如果您想在hql中对其进行评估,这对您没有帮助。

    两个想法:

    • 一个将其设置为空的构造函数,如果 空的。
    • A @PostLoad / @PostConstruct 方法 也一样。