【问题标题】:pitfalls of collections of entities in HibernateHibernate中实体集合的陷阱
【发布时间】:2009-07-02 21:26:08
【问题描述】:

好的,这是this one 的后续问题,因为我现在真的很困惑。

假设我在实体PersonEvent 之间存在一对多或多对多关联,这样Java 中的Person 类包含Set<Event>。 (让我们忽略 Event 是否包含单个 PersonSet<Person>。)

Events 是存储在数据库中的实体,因此我可以更改事件字段。处理 Event 可变性而不使 Java Set 身份检查混淆的正确方法是什么?在这种情况下,您永远不应该覆盖 hashCode() 和/或 equals() 吗? (例如身份 = 基于对象引用身份)

如果我希望对 Events 进行排序(例如,按事件开始时间),我如何管理更改 Event 的字段?一旦更改传播到那里,数据库就会很好地处理它,但是在 Java 方面,这是否意味着为了更改集合中的事件,我必须删除它、更改它并重新插入?或者没有真正的方法来维护 Hibernate 映射的 Java 端的排序顺序? (因此我必须将其视为无序的,因此每当我想获得 Events 的排序列表时,我必须在 Java 中处理排序?)

编辑: 糟糕,我刚刚在 equals/hashCode 上找到了这些讨论:

【问题讨论】:

    标签: java hibernate collections mutable


    【解决方案1】:

    这根本不是一个陷阱,它强制执行您告诉它期望的语义。 真正的问题是“当我所谓的关键字段发生变化时,平等会发生什么”。是的,它就在窗外。所以,是的,您最终可能会遇到这样的情况:有人根据这些键更改了您集合中的一个字段,使其与另一个字段相等。 是的,您的业务逻辑需要处理这个问题。更新 Event 对象时,您必须确保新值有效,不仅适用于字段,而且适用于您将它们放入的上下文。在这种情况下,您不能允许更新的事件对象重复一个现有的事件。 这个问题在 SQL 中更加难看。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      相关资源
      最近更新 更多