一尘不染

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

hibernate

今天,我面临一个有趣的问题。我一直在使用Hibernate
JPA和SINGLE_TABLE策略来建立继承层次结构。后来,我在层次结构中添加了一个超类,该类定义了TABLE_PER_CLASS策略。结果是整个层次结构都表现为TABLE_PER_CLASS。如果我们阅读@Inheriatancejavadoc
,这当然看起来很公平:

定义用于实体类层次结构的继承策略。它是在实体类上指定的,该实体类是实体类层次结构的根。

但是,Hibernate文档说:

可以对同一继承层次结构的不同分支使用不同的映射策略

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

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


阅读 212

收藏
2020-06-20

共1个答案

一尘不染

好吧,如果你阅读Hibernate文档的“传承”一章远一点
:-)你会看到,表每层次和表每个子类策略混合给出的例子是在现实中没有超过表格,每带有辅助表的层次结构:

<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 { ... }
2020-06-20