JPA / Hibernate和复合键

时间:2012-08-06 21:45:26

标签: jpa composite-primary-key

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

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

1 个答案:

答案 0 :(得分:8)

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

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

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

  • 少量非规范化
  • 使用未加载的对象(如果使用自动生成的ID,你应该这样做)在某些情况下可能意味着麻烦,因为相等方法等需要ID才能正常工作