Подтвердить что ты не робот

Унаследованный абстрактный класс с JPA (+ Hibernate)

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

@Entity
public class RefExample extends RefData {

}

(Будет несколько версий этих классов, RefSomeOtherExample и т.д. и одна таблица db для каждого класса. Некоторые могут добавлять дополнительные поля (столбцы), но большинство из них просто будут использовать базовые поля, унаследованные от базового класса 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;
    }
}

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

4b9b3361

Ответ 1

Из спецификации 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 в то же время.

Ответ 2

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

Я прочитал этот форум, и я попробовал аннотацию @MappedSuperClass. Это делает трюк.

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

@Entity
@Table(name="view_name")

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

Наследование в hibernate-аннотации для таблицы со знаком с использованием @DiscriminatorColumn работало для меня.

Спасибо.

Ответ 3

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

Отметьте this