gpt4 book ai didi

java - 通过 JPA 注释更改类层次结构分支中的继承策略

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:04:33 24 4
gpt4 key购买 nike

今天我遇到了一个有趣的问题。我一直在使用 Hibernate JPA 的继承层次结构,使用 SINGLE_TABLE 策略。后来,我在层次结构中添加了一个父类(super class),它定义了 TABLE_PER_CLASS 策略。结果是整个层次结构都表现为 TABLE_PER_CLASS。如果我们阅读 @Inheriatance javadoc,这当然看起来很公平:

Defines the inheritance strategy to be used for an entity class hierarchy. It is specified on the entity class that is the root of the entity class hierarchy.

Hibernate docs , 然而, 说:

It is possible to use different mapping strategies for different branches of the same inheritance hierarchy

并继续说明此声明的豁免。这是通过 XML 配置完成的。

所以,最后,我的问题是 - 有没有一种方法(也许是 hibernate 属性)通过注释和使用 EntityManager 启用上述 xml 行为。

最佳答案

好吧,如果您阅读了 Hibernate 文档的“继承”一章 a little further :-) 你会看到给出的用于混合每个层次结构表和每个子类表策略的示例实际上只不过是每个层次结构表和次级表:

<class name="Payment" table="PAYMENT">
<id name="id" type="long" column="PAYMENT_ID">
<generator class="native"/>
</id>
<discriminator column="PAYMENT_TYPE" type="string"/>
<property name="amount" column="AMOUNT"/>
...
<subclass name="CreditCardPayment" discriminator-value="CREDIT">
<join table="CREDIT_PAYMENT">
<property name="creditCardType" column="CCTYPE"/>
...
</join>
</subclass>
<subclass name="CashPayment" discriminator-value="CASH">
...
</subclass>
</class>

您可以使用 @SecondaryTable annotation 来做同样的事情:

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="PAYMENT_TYPE")
@DiscriminatorValue("PAYMENT")
public class Payment { ... }

@Entity
@DiscriminatorValue("CREDIT")
@SecondaryTable(name="CREDIT_PAYMENT", pkJoinColumns={
@PrimaryKeyJoinColumn(name="payment_id", referencedColumnName="id")
)
public class CreditCardPayment extends Payment { ... }

@Entity
@DiscriminatorValue("CASH")
public class CashPayment extends Payment { ... }

关于java - 通过 JPA 注释更改类层次结构分支中的继承策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1825676/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com