Унаследованный абстрактный класс с JPA (+ Hibernate) - PullRequest
40 голосов
/ 30 сентября 2010

Как бы вы настроили аннотации в следующем примере кода?Я хотел бы придерживаться только аннотаций JPA и избегать специфических зависимостей Hibernate. Правильный ли приведенный ниже код?

@Entity
public class RefExample extends RefData {

}

(будет несколько версий этих классов, RefSomeOtherExample и т. Д., И одна таблица в базе данных на класс. Некоторые могут добавлять дополнительные поля (столбцы)но большинство просто использует базовые поля, унаследованные от базового класса «RefData».)

Базовый класс:

@Entity
public abstract class RefData {

    private long id;
    private String code;
    private String desc;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(unique = true, nullable = false)
    public long getId() {

        return id;
    }

    public void setId(long id) {

        this.id = id;
    }

    @Column(unique = true, nullable = false, length=8)
    public String getCode() {

        return code;
    }

    public void setCode(String code) {

        this.code = code;
    }

    @Column(unique = true, nullable = false, length=80)
    public String getDesc() {

        return desc;
    }

    public void setDesc(String desc) {

        this.desc = desc;
    }
}

В конечном итоге я хотел бы сгенерировать сценарии создания схемы из этогоиспользуя класс SchemaExport в Hibernate.В приведенном выше случае эти два класса должны приводить только к созданию одной таблицы с именем «RefExample» с тремя столбцами из «RefData».Будет ли это работать?

Ответы [ 3 ]

86 голосов
/ 30 сентября 2010

Из спецификации JPA 1.0:

И абстрактные, и конкретные классы могут быть сущностями. Как абстрактные, так и конкретные классы могут быть аннотированы аннотацией Entity , отображены как сущности и опрошены как сущности.

Объекты могут расширять классы не-сущностей, а классы не-сущностей могут расширять классы-сущности .

Если вам нужна одна таблица, вы должны использовать Single Table Наследование.

Просто определите столбец дискриминатора следующим образом:

@Entity
@DiscriminatorColumn(name="REF_TYPE")
public abstract class RefData {

Но если вы не хотите полагаться на стратегии наследования JPA, вместо этого вы можете использовать MappedSuperclass:

@MappedSuperclass
public abstract class RefData {

JPA спецификация

Объект может наследовать от суперкласса, который предоставляет постоянное состояние объекта и информацию отображения, но который сам не является объектом. Как правило, цель такого сопоставленного суперкласса состоит в том, чтобы определить информацию о состоянии и отображении, которая является общей для нескольких классов сущностей .

Имейте в виду, вы не можете использовать @Entity и @MappedSuperclass одновременно.

5 голосов
/ 27 июля 2011

@ MappedSuperclass работает для меня.Я изо всех сил пытался отобразить вид на 2 объекта, которые являются родительским и дочерним классами.Мой взгляд объединен из 2 таблиц.Первичные ключи из обеих таблиц присутствуют в представлении. @ DiscriminatorColumn у меня не работает, так как для него требуется столбец, выделенный исключительно для типа данных объекта, а также выбрасывается 'repeated Column in object exception', который я не смог решить.

Я прочитал этот форум и попробовал аннотацию @ MappedSuperclass .Это помогает.

Я поместил @ MappedSuperclass в суперкласс и поместил @ Id и @ GeneratedValue в идентификатор суперкласса.,В подклассе я указал как

@Entity
@Table(name="view_name")

и использовал объект подкласса для извлечения данных из представления.Вот и все.

Наследование в аннотациях гибернации для объединенной таблицы без использования @ DiscriminatorColumn сработало для меня.

0 голосов
/ 30 сентября 2010

Вы можете использовать одну из стратегий наследования для этого. Ваш случай выглядит как случай Единого класса для иерархии.

Проверка это

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