有没有办法在JPA中覆盖实体的子类中的ID?

时间:2013-11-26 12:12:29

标签: java hibernate inheritance jpa polymorphism

在不使用抽象基类(或超类)的特定要求下,我需要实现两个实体的简单层次结构,其中一个实体应该扩展另一个实体,但它们具有不同的@Id。

我的谷歌搜索似乎得出结论这是不可能的,或者只是在我使用映射超类的情况下(由于某种策略在我的情况下是禁止的)。

我不想复制具有几十个属性的实体代码,然后通过添加/覆盖属性来修改副本,以避免将来出现维护问题,但后来我陷入了JPA限制。

任何帮助/建议都将不胜感激。

1 个答案:

答案 0 :(得分:3)

对非抽象派生实体使用不同的id类型与JPA继承策略不兼容。

我的意思是:

想象一下,您已成功,层次结构中的不同类使用id的不同不兼容类型。

  • 在这种情况下,如何为单个表继承定义数据库约束?
  • 和联合继承?

编辑:在ID定义方面,JPA不区分继承策略。你甚至不能确定你可以使用TABLE_PER_CLASS纯JPA。实际上所有提供程序都实现了它,但它被指定为可选的,因此是最不可移植的继承策略。

但问题仍然存在。为了使表能够由持久性提供程序明确地使用,数据库约束如何看?例如。哪些列应包含数据库级别的主键?

如果你不能使父实体既不抽象也不能嵌入也不能使用相同的id,你将不得不解决这个问题。你如何做到这在很大程度上取决于你想要达到的目标以及你所拥有的组织限制。

有几种可能性 - 最少侵入性的是组合,在A中具有A作为场,有效地创建1-1关系。

更丑陋的方法可能是本机和构造函数查询,但我怀疑你想要下降到那么远。

tl; dr 不,这是不可能的。