JPA/Hibernate 和复合键

Posted

技术标签:

【中文标题】JPA/Hibernate 和复合键【英文标题】:JPA/Hibernate and composite keys 【发布时间】:2012-08-06 21:45:25 【问题描述】:

我遇到了一些 SO 讨论和其他帖子(例如 here、here 和 here),其中描述了将复合主键与 JPA 结合使用要么是尽可能避免的事情,要么是由于遗留数据库或具有“毛茸茸”的极端情况而成为必需品。由于我们正在从头开始设计一个新数据库并且没有任何遗留问题需要考虑,因此是否建议或者说更安全地避免使用 JPA 的复合主键(Hibernate strong> 或 EclipseLink?)。

我自己的感觉是,由于 JPA 引擎已经足够复杂,当然,就像所有软件一样,并非没有错误,最好忍受非规范化表而不是忍受运行的恐惧与复合主键相关的错误(理由是数字单列主键和外键是 JPA 引擎支持的最简单的用例,因此应该尽可能无错误)。

【问题讨论】:

【参考方案1】:

这两种方法我都试过了,我个人更喜欢避免使用复合主键,原因如下:

您可以创建一个包含 id 字段的超类,因此您不必在所有实体中都使用它。 实体创建变得更加容易 JPA 总体上表现更好 引用实体变得更容易。例如,将一堆 ID 存储在一个集合中,或者在网页的查询字符串中指定一个 id,这在很大程度上简化了,只需使用一个数字即可。 您可以使用适用于所有实体的超类中指定的单个 equals 方法。 如果您使用 JSF,您可以制作通用转换器 使用数据库客户端时更容易指定对象

但它也带来了一些不好的部分:

少量的非规范化 在某些情况下,使用非持久对象(如果您使用自动生成的 ID,您应该这样做)可能会带来麻烦,因为等式方法等需要一个 ID 才能正常工作

【讨论】:

以上是关于JPA/Hibernate 和复合键的主要内容,如果未能解决你的问题,请参考以下文章

JPA(休眠)映射OneToMany不正确?

在 JPA/Hibernate 中正确使用 flush()

手把手教你 Spring Boot 整合 Spring Data Jpa

“插入忽略”或“重复键更新”使用 @Query 和 @Modifying 而不使用 nativeQuery 或 save() 或 saveAndFlush() JPA Hibernate

使用 JPA Hibernate 自动保存子对象

JPA Hibernate 使用UUID做为主键的问题