根据具体类继承混合Joined和Table

时间:2011-05-12 12:07:27

标签: hibernate inheritance jpa

我有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)

我已经看到了每个层次结构混合表和连接继承策略的示例,但我想实现上面提到的内容而不使用每个层次结构的表。

请帮帮我。

2 个答案:

答案 0 :(得分:0)

“每个具体类的表”和“连接的子类”策略不能混合,因为它们是互斥的:

  1. “每个具体类的表”表示类的所有属性 - 包括继承的 - 应该映射到与具体类关联的表。
  2. “已加入的子类”表示此特定类的属性 - 不包括继承的 - 应映射到与此类关联的表。
  3. 考虑到这一点,以你的A,B和C类为例,你想在B级混合上述策略,Hibernate应该用C做什么?

    • C使用“每个具体类的表”,因此应将A,B,C的所有属性映射到“C_table”。
    • A正在使用“已加入的子类”,因此应将其所有属性映射到“A_table”。

    您现在已将您的数据复制到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 {

}