这个问题基本上是对以下问题的跟进:Should I write equals() methods in JPA entities?和What is the best practice when implementing equals() for entities with generated ids
首先一些背景信息...
您可以经常遇到以下主键组合:
1. 自然键(业务键):通常是实体的一组真实、多列属性。
2. 人工键(替代键):无意义,通常是自动增量(IDENTITY、AUTO_INCREMENT、AUTOINCREMENT、SEQUENCE、SERIAL等) ID。
3. 混合键(半自然/半人工键):通常由人工ID和一些额外的自然列组成,例如任何引用使用ID并扩展该键(entity_id、ordinal_nbr或类似)的另一个表的表。
频繁的场景:对根、分支或叶继承表的多对一引用,这些表通过识别关系/依赖键共享一个共同的“愚蠢”ID。 当另一个表需要引用所有实体类型时,根(和分支)表通常是有意义的,例如PostAddresses -> Contacts,其中Contacts具有子表Persons、Clubs和Facilities,它们除了可联系之外没有任何共同点。
现在来看JPA:
在Java中,我们可以创建其PK可能不完整(null或部分null)的新实体对象,这是一个DBMS最终会阻止我们将其插入到DB中的实体(行)。
但是,在与应用程序代码一起工作时,通常很方便拥有新的(或分离的)实体,即使新实体对象还没有PK值,也可以将其与现有(托管)实体进行比较。为了针对具有自然键列的任何实体实现这一点,请使用它们来实现equals()和hashCode()(如其他两个SO帖子所建议的)。
问题:
但是,当无法确定自然/业务键时,例如Contacts表的情况,该表基本上只是一个ID(加上鉴别器)时,您该怎么办?什么是基于哪些列进行equals()和hashCode()实现的良好列选择策略?(上述2和3的人工密钥)
显然选择不多...
一个(天真的)目标是实现相同的“瞬态可比性”。能做到吗?如果不能,人工ID equals()和hashCode()实现的一般方法是什么?
注意:我已经在使用Apache EqualsBuilder和HashCodeBuilder...我有意地“天真化”了我的问题。
您可以经常遇到以下主键组合:
1. 自然键(业务键):通常是实体的一组真实、多列属性。
2. 人工键(替代键):无意义,通常是自动增量(IDENTITY、AUTO_INCREMENT、AUTOINCREMENT、SEQUENCE、SERIAL等) ID。
3. 混合键(半自然/半人工键):通常由人工ID和一些额外的自然列组成,例如任何引用使用ID并扩展该键(entity_id、ordinal_nbr或类似)的另一个表的表。
频繁的场景:对根、分支或叶继承表的多对一引用,这些表通过识别关系/依赖键共享一个共同的“愚蠢”ID。 当另一个表需要引用所有实体类型时,根(和分支)表通常是有意义的,例如PostAddresses -> Contacts,其中Contacts具有子表Persons、Clubs和Facilities,它们除了可联系之外没有任何共同点。
现在来看JPA:
在Java中,我们可以创建其PK可能不完整(null或部分null)的新实体对象,这是一个DBMS最终会阻止我们将其插入到DB中的实体(行)。
但是,在与应用程序代码一起工作时,通常很方便拥有新的(或分离的)实体,即使新实体对象还没有PK值,也可以将其与现有(托管)实体进行比较。为了针对具有自然键列的任何实体实现这一点,请使用它们来实现equals()和hashCode()(如其他两个SO帖子所建议的)。
问题:
但是,当无法确定自然/业务键时,例如Contacts表的情况,该表基本上只是一个ID(加上鉴别器)时,您该怎么办?什么是基于哪些列进行equals()和hashCode()实现的良好列选择策略?(上述2和3的人工密钥)
显然选择不多...
一个(天真的)目标是实现相同的“瞬态可比性”。能做到吗?如果不能,人工ID equals()和hashCode()实现的一般方法是什么?
注意:我已经在使用Apache EqualsBuilder和HashCodeBuilder...我有意地“天真化”了我的问题。