Унаследованный абстрактный класс с 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". Будет ли это работать?
Ответы
Ответ 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