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