4

我遇到了一些SO讨论和其他帖子(例如,此处此处此处),其中将复合主键与JPA一起使用被描述为尽可能避免的事情,或者由于遗留数据库或具有“毛茸茸”的必要性角落案例。由于我们正在从头开始设计一个新数据库并且没有任何遗留问题需要考虑,因此建议或者更安全地避免使用JPAHibernateEclipseLink?)的复合主键。

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

4

1 回答 1

7

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

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

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

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