您如何处理由 hibernate 管理的 java 对象的对象相等性?在“hibernate in action”一书中,他们说应该优先考虑业务密钥而不是代理密钥。
大多数时候,我没有业务密钥。想想映射到一个人的地址。地址保存在 Set 中并显示在 Wicket RefreshingView 中(使用 ReuseIfEquals 策略)。
我可以使用代理 id 或使用 equals() 和 hashCode() 函数中的所有字段。
问题是这些字段在对象的生命周期内会发生变化。要么是因为用户输入了一些数据,要么是由于在 OSIV(在视图中打开会话)过滤器中调用了 JPA merge() 而导致 id 发生了变化。
我对 equals() 和 hashCode() 合约的理解是,它们在对象的生命周期内不应该改变。
到目前为止我已经尝试过:
- equals() 基于 hashCode() ,它使用数据库 id (如果 id 为空,则为 super.hashCode() )。问题:新地址以空 id 开头,但在附加到一个人时获得一个 id,并且此人在 osiv-filter 中被合并()(重新附加)。
- 在第一次调用 hashCode() 时延迟计算哈希码并使该哈希码 @Transitional。不起作用,因为 merge() 返回一个新对象并且哈希码不会被复制。
我需要的是我认为在对象创建期间分配的 ID。我在这里有什么选择?我不想介绍一些额外的持久性属性。有没有办法明确告诉 JPA 为对象分配 ID?
问候