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时,对应表的主键由ProductCurrency的键组成。我尝试了以下方法:

@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_idproduct_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复合主键[重复]的主要内容,如果未能解决你的问题,请参考以下文章

jpa复合主键表不返回值

使用 Quarkus 的 JPA 中的复合主键是不是可能?

jpa 复合主键并可与唯一键连接

如何在 JPA 中创建和处理复合主键

具有复合主键查询的 JPA COUNT 不起作用

具有父复合 pk 的 JPA OneToMany 是子主键派生实体问题的一部分