JPA/Hibernate和复合键

Mar*_*tus 4 jpa composite-primary-key

我遇到了一些SO讨论和其他帖子(例如这里,这里这里),其中使用复合主键与JPA被描述为可能的情况下要避免的事情,或者由于遗留数据库或具有"毛茸茸的"而需要角落案件.既然我们从头开始设计一个新的数据库并且没有任何遗留问题需要考虑,建议还是让我们说更安全,以避免使用JPA(HibernateEclipseLink?)的复合主键.

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

Ras*_*nke 7

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

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

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

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