Hibernate Встраиваемое Наследование - PullRequest
7 голосов
/ 28 мая 2009

У меня есть объект с полем, которое может быть нескольких типов объектов. Этот объект кодируется в одной таблице со столбцом дискриминатора для подтипов поля. Каждый из этих подтипов имеет свои поля, сопоставленные со столбцом в таблице родительских объектов. Я не могу смоделировать это в спящем режиме. Приведенный ниже код возвратит ноль для getSubfield() независимо от того, какие данные подтипа находятся в таблице.

Схема

  id   type   whosit   whatsit  
+----+------+--------+---------+
| 1  | "A"  | "test" | null    |
| 2  | "B"  | null   | "test"  |
+----+------+--------+---------+

Доменные объекты

@Entity
public class Parent {
    protected @Id @GeneratedValue int id;
    protected Subfield subfield;

    public Subfield getSubfield() {return subfield;} 
}


@Embeddable
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="type", discriminatorType=DiscriminatorType.STRING)
public abstract class Subfield {}


@DiscriminatorValue("A")
public class TypeA extends Subfield {
    public String whosit;
}


@DiscriminatorValue("B")
public class TypeB extends Subfield {
    public String whatsit;
}

«ВЫБЕРИТЕ p ОТ ПЕРЕНОСА p»

{id=1,subfield=null}
{id=2,subfield=null}

Можно ли выполнить то, что я хочу, с помощью этой объектной модели, или мне нужно стать более креативным (это устаревшая база данных, изменение схемы не является предпочтительным)

Ответы [ 3 ]

5 голосов
/ 20 мая 2013

Как указывает автор вопроса, hibernate не поддерживает наследование встраиваемых классов (https://hibernate.atlassian.net/browse/HHH-1910).

Согласно вики Eclipse, JPA не определяет это поведение, но EclipseLink поддерживает его (http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Entities/Embeddable#Inheritance).

Мое предложение состоит в том, чтобы разбить иерархию классов полностью внутри Подполя. Ужасно, но должно работать, пока это не решено.

3 голосов
/ 28 мая 2009

Хорошо, вы не можете легко изменить схему, но как насчет добавления нескольких видов?

1 голос
/ 07 декабря 2014

Я знаю, что это старый.

Один из способов обойти это, как указано выше. Создать вид. Вы говорите, что не хотите менять схему. Тогда не надо. Вы можете создать новую схему, которая отображает старую схему и делает то, что вы хотите. (Возможно в зависимости от базы данных)

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