好的,这是 this one 的后续问题,因为我现在真的很困惑。
假设我在实体之间有一对多或多对多关联 Person
和Event
这样一个 Person
Java 中的类包含 Set<Event>
。 (让我们忽略 Event 是否包含单个 Person
还是 Set<Person>
。)
Event
s 是存储在数据库中的实体,因此我可以更改事件字段。正确的处理方式是什么Event
可变性和 Java Set<> 身份检查不会混淆吗?你永远不应该覆盖 hashCode()
和/或 equals()
在这种情况下? (例如身份=基于对象引用身份)
如果我想要Event
要订购(例如按事件开始时间),我如何管理更改 Event
的字段?一旦更改传播到数据库,数据库就会很好地处理它,但在 Java 方面,这是否意味着为了更改集合中的事件,我必须删除它,更改它,然后重新插入?或者是否没有真正的方法来维护 Hibernate 映射的 Java 端的排序顺序? (因此,每当我想要获得 Event
的排序列表时,我都必须将其视为无序,并在 Java 中处理排序?)
编辑:哎呀,我刚刚发现这些关于 equals/hashCode 的讨论:
最佳答案
这根本不是一个陷阱,它强制执行您告诉它期望的语义。 真正的问题是“当我所谓的关键字段发生变化时,平等会发生什么”。是的,它就在窗外。所以,是的,你最终可能会遇到这样的情况:有人根据这些键更改了你的集合中的一个字段,使其等于另一个字段。 是的,您的业务逻辑需要处理这个问题。当您更新事件对象时,您必须确保新值不仅对于字段有效,而且对于您将其放入的上下文也有效。在这种情况下,您不能允许更新的事件对象重复一个现有的事件。 这个问题在 SQL 中更加难看。
关于java - Hibernate 中实体集合的陷阱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1076764/