java - Hibernate 中实体集合的陷阱

标签 java hibernate collections mutable

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

假设我在实体之间有一对多或多对多关联 PersonEvent这样一个 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/

相关文章:

转换为 unicode 的 java 错误

java - 构造函数给出 2 个错误

java - 比较日期是否早于 24 小时

java - 如何查看 java.util.PriorityQueue 的尾部?

c# - 在按钮集合中创建、使用和比较元素

java - Akka 中的轻量级线程

DAO类Junit测试的Java配置(Spring5+Hibernate5)

java - HQL 不接受带有 join 的更新 SQL

java - Hibernate NoSuchFieldError 实例但仅适用于 Struts 1?

java - 如何在最佳成绩历史记录 Activity 中添加取得最佳成绩的玩家的姓名?