是否可以在一个ID下创建继承?

时间:2016-07-18 16:56:27

标签: hibernate spring-boot

我想知道是否有可能创建不同的表,这些表都属于PK?我的情况是我有大约15种不同类型的产品。每个订单可能有多个产品(以多对多表格表示,我们将订单的PK与产品的PK连接,第3列表示数量,第4列表示价格)。现在,是否可以创建一个表结构,其中每个产品类别都有自己的表,但它们都属于多对多表中的一个PK?

1 个答案:

答案 0 :(得分:1)

不确定。看看JPA inheritance docs。听起来你想要一个Joined子类策略或一个Table_per_class层次结构策略。

简化示例:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name="DISC")
public abstract class SuperClass{
    // your common fields including primary key
    @Id
    private Long myKey;

    // ...
}

@Entity
@DiscriminatorValue("FOO")
public class Foo extends SuperClass {
    // Foo fields. Can be empty, depending on use case
}

@Entity
@DiscriminatorValue("BAR")
public class Bar extends SuperClass {
   // Bar fields
}   

@Entity
public class MyRelationshipClass {

    @EmbeddedId
    private MyKey key;

    @ManyToOne
    @JoinColumn(name="order_key")
    private MyOrder order;

    @ManyToOne
    @JoinColumn(name="fooBarKey")
    private SuperClass fooBar;
    // other fields omitted
}

@Embeddable
public class MyKey {
    @Column(name="order_key")
    private Long order;

    @Column(name="fooBarKey")
    private Long fooBarKey;
}

在这种情况下,您最终会得到一个SuperClass表,其中包含myKey列,DISC列以及您定义的任何其他共享列。您还将获得一个带有myKey列的Foo和Bar表以及它们在子类中定义的任何列。您的MyRelationshipClass将有一个表,其中包含MyOrder键的列(示例中省略的类),Foo / Bar myKey的列以及您定义的其他列。如果您愿意,可以省略Discriminator列。

如果您希望Foo和Bar与SuperClass在同一个表中,则更改为IneheritanceType.SINGLE_TABLE,其他方面示例保持不变。在这种情况下,您必须包含鉴别器。使用JOINED可能会对大容量表或广泛的继承映射产生性能影响,但会提供更合理的数据分离。

注意:有些JPA提供程序(即Hibernate)允许您在EmbeddedId.中定义关系映射,并非全部,所以您需要在EmbeddedId之外定义关系,如上所述。

HTH