Отображение наследования с join и типом - PullRequest
0 голосов
/ 06 октября 2011

У меня довольно простой вопрос.Допустим, у меня есть иерархия классов A <- B (<code>class B extends class A).Оба являются бобами и сохраняются hibernate в базе данных.Чтобы отобразить иерархию, я знаю два метода:

  1. все в одной таблице: A и B будут сохранены в одной таблице, а поле type будет определять, относится ли запись к типуA или B.
  2. по одной таблице для каждого типа: при сохранении объекта B Hibernate поместит его в таблицу B, а также создаст запись в таблице A.Идентификаторы будут одинаковыми, чтобы убедиться, что это один объект.

Теперь я хотел бы объединить эти два: всякий раз, когда я сохраняю объект из типа B, он также должен быть записан в таблицу B.как в таблице А.Но также должно быть поле «тип» в таблице «А», где показан тип каждой записи.

Я пробовал это со следующими аннотациями в class A:

@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)

Первый определяет, что каждый объект будет сохранен в отдельных таблицах, а второй должен записать тип в поле типа.

Class B имеет эту аннотацию:

@DiscriminatorValue("B")

Но это, к сожалению, не работает.Когда я хочу вставить объект A в таблицу A, он сохраняет эту запись два раза, а затем выдает ошибку, что ключ уже используется.Поэтому я думаю, что это не правильный способ сделать это.

Кто-нибудь может мне помочь с этим?Учебники, которые я нашел, довольно смущают меня, так как я очень новичок в этой теме.Кроме того, большинство объяснений используют XML-файлы вместо аннотаций.

Ответы [ 2 ]

0 голосов
/ 06 октября 2011

Это представляется невозможным при использовании аннотаций: см. https://hibernate.onjira.com/browse/ANN-140. Это возможно и задокументировано в справочной документации, если вы используете файлы XML для сопоставления этих объектов.

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

0 голосов
/ 06 октября 2011

Если ваш провайдер не разрешает это полуавтоматически через @Inheritance, просто добавьте один постоянный атрибут «тип» в класс A и установите другое значение в B, чем в A.

Минимальный пример:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class A {
    @Id
    private int id;
    String type = "A";
}

@Entity
public class B extends A {
    //initializer block is executed for all possible constructors
    {
        //writing over value set in A
        type = "B";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...