JPA-复合键与多对多表中生成的id
我正在创建一种社交网络,我的用户可以跟随其他用户。所以我有一个实体,比如:JPA-复合键与多对多表中生成的id,jpa,many-to-many,unique-index,surrogate-key,compound-key,Jpa,Many To Many,Unique Index,Surrogate Key,Compound Key,我正在创建一种社交网络,我的用户可以跟随其他用户。所以我有一个实体,比如: @Entity public class FollowedUser{ @ManyToOne private User user; @ManyToOne private User followedUser; //more fields ... } 我不能有太多的关系,因为我的FollowedUser实体中有更多的字段。现在,我的问题是: 我应该使用复合键还是生成的id
@Entity
public class FollowedUser{
@ManyToOne
private User user;
@ManyToOne
private User followedUser;
//more fields
...
}
我不能有太多的关系,因为我的FollowedUser实体中有更多的字段。现在,我的问题是:
1。我建议使用代理键。我发现将记录的数据库标识与其业务标识分开很有帮助。如果这两个概念是混合的,那么对它们进行正确的建模并在以后重新建模可能会很麻烦。您引用了一些好的答案,因此您可能知道主要的优点和缺点,无需在此重复。另外一点是,您可以依赖代理键(如
UUID
)来正确地实现equals
和hashCode
)。为组合键实现这些功能,以便与集合和db一起很好地发挥作用,这可能是一件棘手的事情
至于您的用例,用户之间的连接可以被视为自己的实体,并具有自动生成的代理PK。您可以在DB中强制实现业务密钥属性的唯一性,请参见第3部分
2.AFAIK,在EmbeddedId
和IdClass
之间做出决定主要是一个品味问题。我更喜欢
IdClass
,因为它避免了在查询id属性时添加导航:
。。。其中a.id.attribute=:att
withEmbeddedId
vs
。。。其中a.attribute=:att
vs.withIdClass
我觉得你的论点没有说服力。复合关键点往往由实体的最具特征的属性组成。将它们隐藏在另一个类中,因为它们碰巧用作DB键,这对我来说似乎很尴尬
3.唯一索引看起来是保证属性组合唯一性的好方法。你可能想读书
如果您还没有使用JPA2.1,您可能需要使用独特的约束,如。非常感谢kostja提供了非常详细的答案。