2013-11-26 31 views
2

根据一个特定的要求,如不使用抽象基类(或超类),我需要实现一个简单的两个实体层次结构,其中一个实体应该扩展另一个实体,但它们有不同的@Id。有没有办法在JPA的实体的子类中覆盖ID?

我对此的搜索似乎认为这是不可能的,或者只是因为我使用映射的超类(由于某种策略而禁止在我的情况下)。

我不想复制具有几十个属性的实体的代码,然后通过添加/覆盖属性来改变重复以避免将来的维护问题,但之后我被困在JPA限制中。

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

+2

超类“A”和子类“B”中的“@ Id”列应该如何显示?为什么不使用委托而不是扩展名,比如'B'使用'A',而不是'B'来扩展'A'? –

+0

@AndreiI在这么多的话......正是:) – kostja

+0

@Andreil,我不明白和/或知道“B使用A”代表团。任何示例或参考将不胜感激。 – fledglingCoder

回答

3

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

我的意思是:

想象一下,你已经在使用的层次结构,并成功不同类别不同的​​不兼容类型的id

  • 如何在这种情况下定义单个表继承的DB约束?
  • 并为加入继承?

编辑:当涉及到id定义时,JPA不区分继承策略。你甚至不能确定你可以使用TABLE_PER_CLASS与纯粹的JPA。几乎所有提供者都实现它,但它被指定为可选,因此是最不可移植的继承策略。

但问题仍然存在。数据库约束如何才能使表可以由持久性提供者明确地使用?例如。哪些列应该包含数据库级别的主键?

如果您不能让父实体既不抽象又不可嵌入也不使用相同的ID,您将不得不解决该问题。你如何做到这一点高度依赖于你想达到什么以及你有什么组织限制。

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

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

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

+0

我想要实现的是实体A有属性,例如,int no(as @Id),String def;和实体B(扩展A)具有长ID(@Id),BigDecimal数量,字符串细节,日期日期...在DB中,表A:NO(INTEGER)(PK),DEF(VARCHAR);表B:NO(INTEGER),DEF(VARCHAR),ID(BIGINTEGER)(PK),AMOUNT(DECIMAL),DETAILS(VARCHAR),DATE(DATE)和via @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) – fledglingCoder

+0

@fledglingCoder不幸继承策略的选择并不会改变最终的答案。我编辑了我的反映。 – kostja

相关问题