Подтвердить что ты не робот

Когда использовать аннотацию DiscriminatorValue в спящем режиме

Что и когда лучший сценарий использования аннотации DiscriminatorValue в спящем режиме?

4b9b3361

Ответ 1

Эти 2 ссылки помогают мне лучше понять концепцию наследования:

http://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html

http://www.javaworld.com/javaworld/jw-01-2008/jw-01-jpa1.html?page=6

Чтобы понять дискриминатор, сначала вы должны понимать стратегии наследования: SINGLE_TABLE, JOINED, TABLE_PER_CLASS.

Дискриминатор обычно используется в наследовании SINGLE_TABLE, потому что вам нужен столбец для идентификации типа записи.

Пример. У вас есть класс Student и 2 подкласса: GoodStudent и BadStudent. Данные как Good, так и BadStudent будут храниться в 1 таблице, но, конечно, нам нужно знать тип и что, когда появится DisccriminatorColumn. См. Ссылки, которые я разместил выше.

Ответ 2

Позвольте мне объяснить вам на примере. Предположим, у вас есть класс Animal, а в классе Animal есть много подклассов, таких как Reptile, Bird... и т.д.

И в базе данных у вас есть таблица с именем ANIMAL

---------------------------
ID||NAME      ||TYPE     ||
---------------------------
1 ||Crocodile ||REPTILE  ||
---------------------------
2 ||Dinosaur  ||REPTILE  ||
---------------------------
3 ||Lizard    ||REPTILE  || 
---------------------------
4 ||Owl       ||BIRD     ||
---------------------------
5 ||parrot    ||BIRD     ||
---------------------------

Здесь столбец TYPE называется DiscriminatorColumn, поскольку этот столбец содержит данные, которые четко разделяют рептилий и птиц. А данные REPTILE и BIRD в столбце TYPE являются значением DiscriminatorValue.

Таким образом, в части Java эта структура будет выглядеть следующим образом:

Класс животных:

@Getter
@Setter
@Table(name = "ANIMAL")
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING, name = "TYPE")
public class Animal {

    @Id
    @Column(name = "ID")
    private String id;

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

}

Класс рептилий:

@Entity
@DiscriminatorValue("REPTILE")
public class Reptile extends Animal {

}

Птичий класс:

@Entity
@DiscriminatorValue("BIRD")
public class Bird extends Animal {

}

Ответ 3

Когда у вас есть наследование объекта с использованием стратегии одиночной таблицы, и вы хотите, чтобы значение столбца дискриминатора было чем-то иным, чем имя класса конкретного класса сущности, или когда тип столбца дискриминатора не STRING.

Это объясняется, например, в javadoc.

Ответ 4

Вот объяснение и один пример в таблице спящего режима для каждой иерархии классов, рассмотрим, что у нас есть базовый класс с именем Payment и 2 производных класса, таких как CreditCard, Check

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

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