1.我推荐使用代理键。我发现将记录的数据库身份与其业务身份分开会很有帮助。如果这两个概念混合在一起,那么对它们进行正确建模并在以后对其进行重构可能会很麻烦。您参考了一些很好的答案,因此您可能知道主要的优点和缺点,无需在此重申。另外一点是,您可以依靠代理键UUID
来正确实施。为复合键实现这些以很好地与集合和数据库一起使用可能会很棘手。equals
hashCode
至于您的用例,用户之间的连接可以被视为它自己的实体,并具有自动生成的代理 PK。您可以强制数据库中业务关键属性的唯一性,请参阅 pt.3。
2. AFAIK,在EmbeddedId
和之间做出决定IdClass
主要是一个品味问题。我更喜欢
IdClass
,因为它避免了在查询 id 属性时添加导航:
... WHERE a.id.attribute = :att
与EmbeddedId
vs。
... WHERE a.attribute = :att
与IdClass
我认为您链接 6 的论点没有说服力。复合键往往由实体的最具特征的属性组成。将它们隐藏在不同的类中,因为它们恰好被用作 DB 键对我来说似乎很尴尬。
3.唯一索引看起来是保证属性组合唯一性的好方法。您可能想阅读这个答案,有一个小例子。
如果您尚未使用 JPA 2.1,您可能想要使用唯一约束,如此处所述。