Вложенное наследование одной таблицы - PullRequest
0 голосов
/ 12 декабря 2011

У меня проблема с объектной моделью и Hibernate. Я хотел бы, чтобы вся модель была сохранена как одна таблица.

Я попробовал следующее, но когда я прошу Hibernate сгенерировать файлы для создания SQL, он создает 3 таблицы вместо только 1. Иерархия классов может показаться странной, но это, конечно, выходит из контекста:)

Попытка 1:

@MappedSuperclass
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "CATEGORY", discriminatorType = DiscriminatorType.STRING, length  = 10)
@Table(name = "the_table")
public abstract class A {}

@MappedSuperclass
@DiscriminatorValue(value = "B")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING, length = 20)
public abstract class B extends A {}

@Entity
@DiscriminatorValue(value = "X")
public class X extends B {}

@Entity
@DiscriminatorValue(value = "Y")
public class Y extends B {}

@Entity
@DiscriminatorValue(value = "Z")
public class Z extends B {}

Попытка 2: Мы добираемся туда, не он создает 1 таблицу, но столбец дискриминатора не генерируется. Кто-нибудь может обнаружить ошибку?

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "CATEGORY", discriminatorType = DiscriminatorType.STRING, length  = 10)
@DiscriminatorFormula(value = "CATEGORY || '_' || TYPE")
@Table(name = "the_table")
public abstract class A {}

@Entity
@DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING, length = 20)
public abstract class B extends A {}

@Entity
@DiscriminatorValue(value = "B_X")
public class X extends B {}

@Entity
@DiscriminatorValue(value = "B_Y")
public class Y extends B {}

@Entity
@DiscriminatorValue(value = "B_Z")
public class Z extends B {}

1 Ответ

2 голосов
/ 12 декабря 2011

Удалите @MappedSuperclass и попробуйте.Также нельзя использовать тег @Inheritance дважды в одной иерархии - будет использоваться только один.

Если вы хотите использовать несколько столбцов в качестве дискриминатора, используйте @ DiscriminatorFormula

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorForumula("CATEGORY || '_' || TYPE")
public abstract class A 

@Entity
@DiscriminatorValue(value = "B_X")
public class X extends A {}

@Entity
@DiscriminatorValue(value = "B_Y")
public class Y extends A {}

@Entity
@DiscriminatorValue(value = "B_Z")
public class Z extends A {}
...