2015-09-03 2 views
0

Учитывая следующий сценарий:Как подкласс класса сущности 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), который не нужен, и IMHO здесь не требуется.

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

TL; DR

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

ответ

0

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

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

package com.example.parent; 

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

    @Id 
    @GeneratedValue 
    protected Integer id; 

    protected String name; 

} 

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

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

+0

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