Смешивание Joined и Table для конкретного класса наследования - PullRequest
1 голос
/ 12 мая 2011

У меня есть классы A, B, C, D, E и F, где B простирается от A, C простирается от B D простирается от A, E простирается от D F простирается от A.

Я хочу использовать объединенную стратегию наследования в A и Table для каждой конкретной стратегии наследования классов от уровней B, D и F. A, B и D являются абстрактными классами, а C, E и F являются конкретными классами.

Возможно ли это, и если да, то как нам это сделать? Когда я пытаюсь, я получаю отдельные таблицы для всех 6 классов и хочу создать 4 таблицы (одну для A и 3 для C, E и F соответственно).

Я использовал @Inheritance (стратегии = InheritanceType.JOINED) в классе А и @Inheritance (стратегии = InheritanceType.TABLE_PER_CLASS) в классах B, D и F

Я видел примеры для смешивания таблиц по иерархии и стратегии объединенного наследования, но я хочу реализовать то, что я упомянул выше, без использования таблицы по иерархии.

Пожалуйста, помогите мне.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2011

Это немного поздно, но у меня недавно была похожая проблема. Решение, которое я нашел, заключается в использовании аннотации @MappedSuperclass для абстрактных классов, для которых вам не нужны отдельные таблицы.

Например,

@Entity(name = "A")
@Inheritance(strategy = InheritanceType.JOINED)
public class A {
    // mapped fields that go into parent A table
}

@MappedSuperclass
public class B extends A {
    // fields that should get pushed down to tables that inherit from B
}

@MappedSuperclass
public class D extends A {
    // fields that should get pushed down to tables that inherit from D
}

@Entity(name = "F"
public class F extends A {
    // fields that are specific to table F
}

@Entity(name = "C")
public class C extends B {
    // fields that are specific to table C 
}

@Entity(name = "E")
public class E extends D {
    // fields that are specific to table E
}

Предполагается, что сопоставления, применяемые в классах @MappedSuperclass (в частности, имена столбцов), одинаковы для таблиц подклассов. Если это не так, вам нужно использовать аннотацию @AttributeOverride в классе. Например,

@MappedSuperclass // this insures that no table is created for this class, but that the mapped fields are pushed down to the subclasses.
public class B extends A {
    @Id @Generated
    @Column(name = "myId")
    public int myId;
}

@Entity(name = "C")
@AttributeOverride(name = "myId", column = @Column(name = "ID"))
public class C extends B {

}
0 голосов
/ 12 мая 2011

Стратегии «Таблица на конкретный класс» и «Объединенные подклассы» нельзя смешивать, поскольку они взаимоисключающие:

  1. «Таблица для конкретного класса» означает ВСЕ свойства класса - , включая унаследованные - должны быть сопоставлены с таблицей, связанной с конкретным классом.
  2. «Объединенные подклассы» означает ТОЛЬКО свойства этого конкретного класса - , исключая унаследованные - должны быть сопоставлены с таблицей, связанной с этим классом.

Имея это в виду, принимая ваш пример классов A, B и C и вы хотите смешать вышеуказанные стратегии на уровне B, что Hibernate должен делать с C?

  • C использует «таблица на конкретный класс» и поэтому должен иметь все свойства A, B, C, сопоставленные с «C_table».
  • A использует "объединенные подклассы", поэтому все его собственные свойства должны быть сопоставлены с "A_table".

Теперь ваши данные дублированы в 2 таблицах. Повторите это с E и F, и это 4 таблицы.

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