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