Использовать один класс для сохранения разных таблиц в БД
Есть класс Uslugi, код ниже описывает его начало
@Entity
@Table(name = "uslugi_poliklinika")
public class Uslugi {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
private int id;
***
}
Необходимо этот класс использовать для сохранения в несколько разных таблиц БД. Т.е. у другого класса будет @Table(name = "uslugi_uzi"), @Table(name = "uslugi_mrt")
Есть ли какая-то возможность использовать один класс для сохранения данных в разные одинаковые таблицы или все же нужно для каждой таблицы свои классы создавать? Просто этот класс используется во многих местах, а если создавать такие классы для каждого отделения будет много дублирующегося кода.
Ответы (1 шт):
В Hibernate существует три стратегии для маппинга иерархии классов на таблицы, которые можно выбрать при помощи аннотации @Inheritance:
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
Используется по умолчанию, считается наиболее эффективной стратегией с точки зрения производительности, так как в ней нет необходимости объединять таблицы.
Здесь вся иерархия записывается в одну таблицу, в которую добавляется колонка-дискриминатор при помощи аннотации@DiscriminatorColumn, значение которой для каждого класса определяется при помощи аннотации@DiscriminatorValue.
Такая таблица объединяет поля для всех классов-потомков (которые следовательно должны быть Nullable), каждый класс-потомок использует свой набор полей.@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
Для каждого класса создаётся и поддерживается отдельная таблица со своим полным набором полей. Атрибуты родительского класса могут переопределяться в классах-потомках при помощи@AttributeOverrides.
Разновидностью этой стратегии можно считать использование абстрактного родительского класса, отмеченного аннотацией@MappedSuperclass, тогда родительский класс не будет мапиться на свою конкретную таблицу.@Inheritance(strategy=InheritanceType.JOINED)
Таблицы для классов-потомков содержат внешний ключ для связи с таблицей родительского класса@PrimaryKeyJoinColumnи наборы только своих полей.