Изменение стратегии наследования в ветвях иерархии классов с помощью аннотаций JPA - PullRequest
3 голосов
/ 01 декабря 2009

Сегодня я столкнулся с интересной проблемой. У меня была иерархия наследования с Hibernate JPA, со стратегией SINGLE_TABLE. Позже я добавил суперкласс в иерархию, которая определила стратегию TABLE_PER_CLASS. В результате вся иерархия стала вести себя как TABLE_PER_CLASS. Это, конечно, кажется справедливым, если мы прочитаем @Inheriatance javadoc:

Определяет стратегию наследования, которая будет использоваться для иерархии классов сущностей. Он указывается в классе сущностей, который является корнем иерархии классов сущностей.

Документы Hibernate , однако, скажите, что:

Возможно использовать разные стратегии отображения для разных ветвей одной и той же иерархии наследования

И продолжает на исключениях из этого заявления. Это делается с помощью конфигурации XML.

Итак, наконец, мой вопрос - есть ли способ (возможно, свойство гибернации) для включения вышеупомянутого поведения XML с помощью аннотаций и использования EntityManager.

1 Ответ

3 голосов
/ 01 декабря 2009

Что ж, если вы прочитаете главу "Наследование" в документации по 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 { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...