Spring JPA - 使用继承类创建复杂的多对多表

时间:2017-11-27 16:53:45

标签: java hibernate jpa inheritance spring-boot

我有一个非常具体的问题。在我的代码库中,我有一些继承自SuperClass的类,两个特定的类具有ComplexRelationship多对多关系类型。对于同一对(ClassA, ClassB),此关系可能会多次出现,因此我无法将其用作主键。

我按以下方式构建了类:

@Entity(name = "SuperClass")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class SuperClass {
    //...
}


@Entity(name = "ClassA")
public class ClassA extends SuperClass {
    @OneToMany(fetch = FetchType.LAZY)
    List<ClassB> manyComplexRelationships;
    //...
}


@Entity(name = "ClassB")
public class ClassB extends SuperClass {

    @OneToMany(fetch = FetchType.LAZY)
    List<ClassA> manyComplexRelationships;
    //...
}


@Entity(name = "complexrelationship")
public class ComplexRelationship {
    @Id @GeneratedValue Long id;
    @ManyToOne
    ClassA classA;
    @ManyToOne
    ClassB classB;
    // other attributes to be persisted
    //...
}

正如您所看到的,SuperClass被定义为使用SINGLE_TABLE层次结构,并且我试图懒洋洋地加载ComplexRelationship个集合。然而,经过大量的反复试验,我发现spring正在创建关系表:

create table complexrelationship_superclass
(classa_id not null, complexrelationship_id not null, classb_id not null)
create table complexrelationship (id, classa_id, classb_id, ...)

正如您所看到的,complexrelationship_superclass表应该是这些类的@ManyToOne关系表,但它有三列而不是通常的两列 - 可能是由于使用了{{ 1}}。

所以,我的问题是

  • 如何在使用此类复杂关系的同时保持SINGLE_TABLE层次结构?
  • 如何创建这种类型的关系,我可以利用它来查询其属性?即。 &#34;选择ClassA为ComplexRelationship旗帜的所有ClassB?1&#34;

使用Spring Boot v 1.5.8.RELEASE

提前谢谢。

0 个答案:

没有答案