В соответствии с Hibernate Reference Documentation при использовании XML-метаданных Hibernate должно быть возможно смешать различные стратегии сопоставления наследования:
http://docs.jboss.org/hibernate/stable/core/reference/en/html/inheritance.html#inheritance-mixing-tableperclass-tablepersubclass
Однако в соответствующем разделе справочника Hibernate Annotations не распространяется следующее: http://docs.jboss.org/hibernate/stable/annotations/reference/en/html/entity.html#d0e1168
С другой стороны, JavaDocs предполагает, что смешение стратегий наследования должно быть возможным. Например, в javax.persistence.DiscriminatorColumn говорится:
Стратегия и столбец дискриминатора указаны только в корне иерархии классов сущностей или в иерархии, в которой применяется другая стратегия наследования.
Ниже приведен пример для сопоставления, которое я пытаюсь достичь. Я хотел бы использовать табличное сопоставление подкласса рядом с корнем иерархии, но изменить сопоставление таблицы на класс, расположенное рядом с листами. Вот пример кода:
@Entity
@Inheritance( strategy = InheritanceType.JOINED )
public abstract class A implements Serializable
{
@Id
private String id;
// other mapped properties...
}
@Entity
@Inheritance( strategy = InheritanceType.SINGLE_TABLE )
public class BB extends A
{
// other mapped properties and associations...
}
@Entity
public class BB1 extends BB
{
// other stuff, not necessarily mapped...
}
@Entity
public class BB2 extends BB
{
// other stuff, not necessarily mapped...
}
@Entity
@Inheritance( strategy = InheritanceType.SINGLE_TABLE )
public class CC extends A
{
// other mapped properties and associations...
}
@Entity
public class CC1 extends CC
{
// other stuff, not necessarily mapped...
}
...
То, что я ожидаю от этого сопоставления, имеет ровно три таблицы: A
, BB
и CC
. Оба BB
и CC
должны иметь столбец дискриминатора по умолчанию, называемый DTYPE
. Они также должны предоставить все столбцы, необходимые для всех сопоставленных свойств и ассоциаций их соответствующих подклассов.
Вместо этого иерархия классов, похоже, использует стратегию наследования на основе подкласса на всем протяжении. То есть Я получаю собственную таблицу для каждого из перечисленных выше объектов. Я бы хотел этого избежать, так как листы иерархии классов чрезвычайно легки, и для каждых из них кажется излишним отдельная таблица!
Я что-то упустил? Любые советы приветствуются! Я буду рад предоставить дополнительную информацию...