Перенос базы данных Hibernate - объединение дублирующихся объектов - PullRequest
0 голосов
/ 10 июля 2019

Предпосылка

Недавно мне было поручено работать с приложением Java + JPA + Hibernate.

Это приложение имеет 4 разных «модуля», каждый из которых представляет собой «копирование + вставка» друг друга, с небольшими изменениями.

Я хочу удалить все дубликаты и работать с одной схемой базы данных (в настоящее время существует одна схема для каждого «модуля»).

Я пытаюсь начать как можно менее "инвазивным" способом, не слишком меняя то, что уже есть.

То, что я сделал, было:

  • Я создал базовый модуль и перенес туда несколько спящих объектов.
  • Я сделал эти сущности абстрактными и создал реализации для каждого модуля.
  • Я создаю новую схему и перемещаю в нее все остальные записи модуля (сейчас мне пришлось отключить ограничения базы данных).
* * 1 022 Пример: * 1 023 *
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "SYSTEM", length = 10, discriminatorType = DiscriminatorType.STRING)
@Table(name = "GROUP")
public abstract class Group<U extends UserGroup> {

    @Id
    private Integer id;

    @Column(name = "CODE")
    private String code;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "group")
    private List<U> users;

@Entity
@Table(name = "USER_GROUP")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "SYSTEM", length = 10, discriminatorType = DiscriminatorType.STRING)
public abstract class UserGroup<G extends Group> {

    @Id
    private Integer id;

    @Column(name = "name")
    private String name;

    @ManyToOne(optional=false)
    @JoinColumn(name = "GROUP_ID", referencedColumnName = "ID", insertable=false, updatable=false)
    private G group;

Реализации просто определяют столбец дискриминатора.

Выпуск

Следующий запрос:

public interface UserGroupRepository<T extends UserGroup> extends CrudRepository<T, Integer> {


    @Query(value = "select grp.code from #{#entityName} ug join ug.group grp where ug.name= ?1")
    Iterable<String> listGroupByUser(String name);

Возвращает 4 элемента, потому что у моего пользователя есть запись для каждого модуля в базе данных (он должен возвращать только 1 элемент).

Вопрос

Используя "@Query", можно ли как-то правильно фильтровать по значению дискриминатора?

Ответы [ 2 ]

0 голосов
/ 12 июля 2019

Да, вы можете попробовать использовать предложение where.Существует специальное свойство класса, которое вы можете использовать для ограничения запроса подтипом.Ниже приведена справочная документация гибернации.

hibernate reference doc.

В вашем случае вы можете использовать имя SubEntity вместо DomesticCat.

Нажмите здесь, чтобы просмотреть документацию по гибернации предложения where.

0 голосов
/ 10 июля 2019

Согласно Hibernate Документ о наследовании , вы можете получить это по table per subclass вместо table per class hierarchy стратегии.

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