根据一个特定的要求,如不使用抽象基类(或超类),我需要实现一个简单的两个实体层次结构,其中一个实体应该扩展另一个实体,但它们有不同的@Id。有没有办法在JPA的实体的子类中覆盖ID?
我对此的搜索似乎认为这是不可能的,或者只是因为我使用映射的超类(由于某种策略而禁止在我的情况下)。
我不想复制具有几十个属性的实体的代码,然后通过添加/覆盖属性来改变重复以避免将来的维护问题,但之后我被困在JPA限制中。
任何帮助/建议将不胜感激。
根据一个特定的要求,如不使用抽象基类(或超类),我需要实现一个简单的两个实体层次结构,其中一个实体应该扩展另一个实体,但它们有不同的@Id。有没有办法在JPA的实体的子类中覆盖ID?
我对此的搜索似乎认为这是不可能的,或者只是因为我使用映射的超类(由于某种策略而禁止在我的情况下)。
我不想复制具有几十个属性的实体的代码,然后通过添加/覆盖属性来改变重复以避免将来的维护问题,但之后我被困在JPA限制中。
任何帮助/建议将不胜感激。
具有不同的id
类型的非抽象派生实体与JPA继承策略不兼容。
我的意思是:
想象一下,你已经在使用的层次结构,并成功不同类别不同的不兼容类型的id
。
编辑:当涉及到id定义时,JPA不区分继承策略。你甚至不能确定你可以使用TABLE_PER_CLASS
与纯粹的JPA。几乎所有提供者都实现它,但它被指定为可选,因此是最不可移植的继承策略。
但问题仍然存在。数据库约束如何才能使表可以由持久性提供者明确地使用?例如。哪些列应该包含数据库级别的主键?
如果您不能让父实体既不抽象又不可嵌入也不使用相同的ID,您将不得不解决该问题。你如何做到这一点高度依赖于你想达到什么以及你有什么组织限制。
有几种可能性 - 侵入性最小的是组合,在B中有A作为字段,有效地创建1-1关系。
更丑陋的方法可能是本地和构造函数查询,但我怀疑你想下降那么远。
tl; dr不,这是不可能的。
我想要实现的是实体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
@fledglingCoder不幸继承策略的选择并不会改变最终的答案。我编辑了我的反映。 – kostja
超类“A”和子类“B”中的“@ Id”列应该如何显示?为什么不使用委托而不是扩展名,比如'B'使用'A',而不是'B'来扩展'A'? –
@AndreiI在这么多的话......正是:) – kostja
@Andreil,我不明白和/或知道“B使用A”代表团。任何示例或参考将不胜感激。 – fledglingCoder