Использовать один класс для сохранения разных таблиц в БД

Рейтинг: -1Ответов: 1Опубликовано: 19.03.2023

Есть класс 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")

Есть ли какая-то возможность использовать один класс для сохранения данных в разные одинаковые таблицы или все же нужно для каждой таблицы свои классы создавать? Просто этот класс используется во многих местах, а если создавать такие классы для каждого отделения будет много дублирующегося кода.

Ответы

▲ 0Принят

В Hibernate существует три стратегии для маппинга иерархии классов на таблицы, которые можно выбрать при помощи аннотации @Inheritance:

  • @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
    Используется по умолчанию, считается наиболее эффективной стратегией с точки зрения производительности, так как в ней нет необходимости объединять таблицы.
    Здесь вся иерархия записывается в одну таблицу, в которую добавляется колонка-дискриминатор при помощи аннотации @DiscriminatorColumn, значение которой для каждого класса определяется при помощи аннотации @DiscriminatorValue.
    Такая таблица объединяет поля для всех классов-потомков (которые следовательно должны быть Nullable), каждый класс-потомок использует свой набор полей.

  • @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
    Для каждого класса создаётся и поддерживается отдельная таблица со своим полным набором полей. Атрибуты родительского класса могут переопределяться в классах-потомках при помощи @AttributeOverrides.
    Разновидностью этой стратегии можно считать использование абстрактного родительского класса, отмеченного аннотацией @MappedSuperclass, тогда родительский класс не будет мапиться на свою конкретную таблицу.

  • @Inheritance(strategy=InheritanceType.JOINED)
    Таблицы для классов-потомков содержат внешний ключ для связи с таблицей родительского класса @PrimaryKeyJoinColumn и наборы только своих полей.