【发布时间】:2011-10-01 16:00:28
【问题描述】:
这个问题基本上是问题的后续:
Should I write equals() methods in JPA entities? 和 What is the best practice when implementing equals() for entities with generated ids
先来点背景...
你可以经常遇到以下主键星座:
- 自然键(业务键):通常是实体的一组真实的多列属性
- 人工键(代理键):无意义,通常是自动递增的(IDENTITY、AUTO_INCREMENT、AUTOINCREMENT、SEQUENCE、SERIAL 等)ID
- 混合键(半自然/半人工键):通常由人工 ID 和一些附加的自然列组成,例如,任何引用另一个使用 ID 并扩展该键的表的表(entity_id、ordinal_nbr ) 或类似的。
常见情况:对根、分支或叶继承表的多对一引用,它们都通过识别关系/依赖键共享一个通用的“愚蠢”ID。 当另一个表需要引用所有实体类型时,根(和分支)表通常是有意义的,例如PostAddresses -> Contacts,其中 Contacts 有子表 Persons、Clubs、 和设施,它们没有任何共同点,只是“可接触”。
现在到 JPA:
在 Java 中,我们可以创建新的实体对象,其 PK 可能不完整(null 或部分 null),一个 DBMS 最终会阻止我们插入 DB 的实体(行)。
但是,在使用应用程序代码时,拥有可以与现有(托管)实体进行比较的新(或分离)实体通常很方便,即使新实体对象还没有 PK 值。要为任何具有自然键列的实体实现这一点,请将它们用于实现 equals() 和 hashCode()(正如其他两个 SO 帖子所建议的那样)。
问题:
但是当无法确定自然/业务键时,您会怎么做,例如 Contacts 表,它基本上只是一个 ID(加上一个鉴别器)?基于 equals() 和 hashCode() 实现的 列选择策略 是什么? (上面的人工钥匙2.和3.)
显然没有太多选择......
一个(天真的)目标是实现相同的“瞬时可比性”。可以做到吗?如果不是,那么人工 ID equals() 和 hashCode() 实现的一般方法是什么样的?
注意:我已经在使用 Apache EqualsBuilder 和 HashCodeBuilder...我故意“天真化”了我的问题。
【问题讨论】:
标签: java jpa equals identity hashcode