我有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)。
我在A和A中使用了@Inheritance(strategy = InheritanceType.JOINED) B,D和F类中的@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
我已经看到了每个层次结构混合表和连接继承策略的示例,但我想实现上面提到的内容而不使用每个层次结构的表。
请帮帮我。
答案 0 :(得分:0)
“每个具体类的表”和“连接的子类”策略不能混合,因为它们是互斥的:
考虑到这一点,以你的A,B和C类为例,你想在B级混合上述策略,Hibernate应该用C做什么?
您现在已将您的数据复制到2个表格中。用E和F重复一遍,它是4个表。
答案 1 :(得分:0)
这有点晚了,但最近我遇到了类似的问题。我找到的解决方案是在抽象类上使用@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 {
}