Как создать подкласс класса сущностей Hibernate, эффективно заменяя родителя?

Учитывая следующий сценарий:

  • Проект с использованием фреймворка
  • Фреймворк определяет основные классы сущностей (используемые для ведения журнала, управления пользователями и т. д.)
  • В проекте есть классы сущностей для конкретных приложений.

Я хочу создать подкласс класса фреймворка таким образом, чтобы не требовалось изменений ни в коде фреймворка, ни в схеме базы данных, специфичной для фреймворка (кроме любых ограничений, которые могут быть введены дополнительными сопоставлениями).

Вот упрощенный класс фреймворка:

package com.example.parent;

@Entity
@Table("entities")
public class ExampleEntity {

    @Id
    @GeneratedValue
    protected Integer id;

    protected String name;

}

И конкретное расширение приложения:

package com.example.child;

@Entity
public class ExampleEntity extends com.example.parent.ExampleEntity {

    @OneToMany
    @JoinColumn
    protected Set<OtherEntity> otherEntities;    

}

Как видите, это просто добавляет дополнительное сопоставление к классу сущностей, специфичному для приложения. Это не будет работать с готовым Hibernate 4.3.11. Он попытается создать столбец дискриминатора (dtype), который нежелателен и ИМХО здесь не требуется.

Я хочу, чтобы это было максимально прозрачно (т.е. без каких-либо изменений на стороне фреймворка) и без какого-либо дополнительного ручного сопоставления/приведения в приложении. По сути, я хочу обмануть Hibernate, чтобы он загружал только экземпляры com.example.child.ExampleEntity, даже не замечая фреймворка.

TL;DR

Как заставить Hibernate загружать объекты из таблицы entities как экземпляры com.example.child.ExampleEntity?


person Koraktor    schedule 03.09.2015    source источник


Ответы (1)


Вы можете использовать @Inheritance(strategy = InheritanceType.JOINED) в родительском классе. Пример можно найти здесь.

Так что это будет работать с

package com.example.parent;

@Entity
@Table("entities")
@Inheritance(strategy = InheritanceType.JOINED)
public class ExampleEntity {

    @Id
    @GeneratedValue
    protected Integer id;

    protected String name;

}

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

Это официальная документация по отображению наследования.

person Korthez    schedule 09.09.2015
comment
Я думаю, что в исходном вопросе говорилось, как заставить его работать без изменения классов фреймворка, но я думаю, вы предлагаете изменить класс фреймворка, добавив аннотацию @Inheritance. - person Chris Knoll; 10.03.2017