Hibernate 每个混凝土类继承的混合连接和表格

Hibernate 每个混凝土类继承的混合连接和表格,hibernate,inheritance,jpa,Hibernate,Inheritance,Jpa,我有A、B、C、D、E和F班,其中 B从A延伸,C从B延伸 D从A延伸,E从D延伸 F从A扩展而来 我想在A和表中使用联接继承策略,从B、D和F级别使用每个具体类的继承策略。 A、 B和D是抽象类,C、E和F是具体类 这是否可能?如果可能,我们应该如何做。当我尝试时,我最终得到了所有6个类的独立表,我希望创建4个表(分别为A和C、E和F创建一个表) 我在类A中使用了@heritance(strategy=heritancetype.JOINED),并且 @类B、D和F中的继承(策略=Inheri

我有A、B、C、D、E和F班,其中 B从A延伸,C从B延伸 D从A延伸,E从D延伸 F从A扩展而来

我想在A和表中使用联接继承策略,从B、D和F级别使用每个具体类的继承策略。 A、 B和D是抽象类,C、E和F是具体类

这是否可能?如果可能,我们应该如何做。当我尝试时,我最终得到了所有6个类的独立表,我希望创建4个表(分别为A和C、E和F创建一个表)

我在类A中使用了@heritance(strategy=heritancetype.JOINED),并且 @类B、D和F中的继承(策略=InheritanceType.TABLE_PER_CLASS)

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

请帮助我。

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

  • “每个混凝土类的表”是指类的所有属性(包括继承的)应映射到与混凝土类关联的表
  • “联接子类”是指只有该特定类的属性(不包括继承的)应映射到与该类关联的表
  • 考虑到这一点,以类A、B和C为例,您希望在B级别混合上述策略,Hibernate应该如何处理C

    • C使用“每个混凝土等级的表”,因此应将A、B、C的所有属性映射到“C_表”
    • A正在使用“连接的子类”,因此应该将其自身的所有属性映射到“A_表”

    您现在已将数据复制到两个表中。对E和F重复这一点,它有4个表。

    这有点晚了,但我最近遇到了类似的问题。我找到的解决方案是在抽象类上使用@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 {
    
    }