JPA复合主键[重复]
Posted
技术标签:
【中文标题】JPA复合主键[重复]【英文标题】:JPA composite primary key [duplicate] 【发布时间】:2011-09-21 00:03:06 【问题描述】:我的 JPA 模型中有以下类(省略了 getter、setter 和无关字段):
@Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Currency
@Id
private Integer ix;
@Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Product
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
我需要定义一个类Price
,这样当DDL is generated from the classes时,对应表的主键由Product
和Currency
的键组成。我尝试了以下方法:
@Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@IdClass(PricePK.class)
public class Price
@Id @ManyToOne(optional = false)
private Product product;
@Id
@ManyToOne(optional = false)
private Currency currency;
@Embeddable
public class PricePK implements Serializable
Integer product;
Integer currency;
但这会为PRICE
表生成以下内容:
create table PRICE (
currency_id int null,
product_id int null,
primary key (currency_id, product_id)
);
注意currency_id
和product_id
都可以为空,当我尝试将 DDL 加载到 SQL Server 时会导致以下错误
无法在表“PRICE”中为可为空的列定义 PRIMARY KEY 约束
我不明白为什么这些可以为空,因为在域模型中它们被注释了
@ManyToOne(optional = false)
DDL 是使用org.hibernate.dialect.SQLServerDialect
SQL 方言生成的。
【问题讨论】:
【参考方案1】:最近我使用复合主键和注释作为双向@OneToMany
创建了多对多关系。这段代码完美无缺。也许会有所帮助:
Mapping ManyToMany with composite Primary key and Annotation:
【讨论】:
【参考方案2】:由于您使用的是@IdClass
,因此PricePK
类不需要使用@Embeddable
注释进行标记。 http://www.java2s.com/Code/Java/JPA/SetIdClassforCompoundKey.htm中给出了一个例子
我尝试您的代码删除PricePK
类上的@Embeddable
,并在mysql 数据库中生成的价格表不带空字段。
以下是您如何使用@EmbeddedId
来获得所需的结果:
(省略了 getter 和 setter)
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Price
@EmbeddedId
PricePK pricePk;
@Embeddable
public class PricePK implements Serializable
@ManyToOne(optional = false)
private Product product;
@ManyToOne(optional = false)
private Currency currency;
【讨论】:
我试过你的建议,但没有任何影响 您想尝试使用@EmbeddedId
方法吗?
不幸的是也没有用以上是关于JPA复合主键[重复]的主要内容,如果未能解决你的问题,请参考以下文章