JPA атрибуты аннотации глубокого наследования - PullRequest
0 голосов
/ 11 января 2012

У меня есть иерархическое отображение JPA, которое имеет глубину в несколько классов.Примерно так

@Entity
@Inheritance(strategy= InheritanceType.SINGLE_TABLE)
public abstract class BaseEntityClass implements Serializable {

    // lots of stuff common to all my entities.

} 

@Entity
@Inheritance(strategy= InheritanceType.TABLE_PER_CLASS)
public abstract class EntityTypeOne extends BaseEntityClass {
   // stuff common to EntityTypeOne
}

@Entity
@Inheritance(strategy= InheritanceType.TABLE_PER_CLASS)
public abstract class EntityTypeTwo extends BaseEntityClass {
   // stuff common to EntityTypeTwo
}

Я знаю, что вы используете метод @Inheritence с суперклассом для определения стратегии отображенияНо как это работает с глубокими иерархиями?Я хочу, чтобы все листовые классы были сопоставлены с их собственными таблицами.Должен ли я сделать SINGLE_TABLE с BaseEntityClass?

1 Ответ

2 голосов
/ 11 января 2012

Ваш базовый класс должен быть помечен TABLE_PER_CLASS.Вот пример из OpenJPA :

@Entity
@Table(name="MAG")
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class Magazine {
    ...
}

@Entity
@Table(name="TABLOID")
public class Tabloid
    extends Magazine {
    ...
}

В соответствии с JPA JavaDocs , аннотация @Inheritance должна быть указана в корне иерархии классов:

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

В спецификации не указывается, может ли эта аннотация размещаться в подклассе, и поэтому ее поведение не определено.

Итак, чтобы ответить на вопрос, который вы задали в комментариях, если у вас есть такая иерархия:

SubSub -> Sub -> Base

Вам нужно только аннотировать Base с помощью @Inheritance(strategy = TABLE_PER_CLASS).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...