具有复合键的 JPA ManyToOne

Posted

技术标签:

【中文标题】具有复合键的 JPA ManyToOne【英文标题】:JPA ManyToOne with composite key 【发布时间】:2014-06-23 08:04:42 【问题描述】:

我有一个品牌实体的模型映射:

@Entity
public class Brand implements Serializable 
    private static final long serialVersionUID = 1L;

    @EmbeddedId
    private BrandPk id;

//...

复合键是:

@Embeddable
public class BrandPk implements Serializable 

    private static final long serialVersionUID = 1L;

    private int id1;

    private int id2;
//...

现在我想加入一个产品实体(一个品牌,多个产品):

我会:

@Entity
public class Product implements Serializable 
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

@ManyToOne
// ???
private Brand brand;

//...

我需要什么才能正确加入我的表实体?

table_brands 有一个由两个字段组成的 PK:id1 和 id2 table_products 有一个带有 id 的 PK,以及一个字段 id_brand 仅引用 id1。

id2 不再使用,根本不重要!

此映射适用于我无法更改的遗留数据库,因此我需要加入“忽略”id2。 我该怎么办?

【问题讨论】:

@ManyToOne @JoinColumn(name="id_brand") ... 导致原因:org.hibernate.AnnotationException: A Foreign key refering model.Brand from model.Product 的列数错误。应该是 2" 【参考方案1】:

如果你添加另一列说 id_brand2 指代 id2,你可以试试这个:

@ManyToOne
@JoinColumns(
     @JoinColumn(name="id_brand", referencedColumnName="id1"),
     @JoinColumn(name="id_brand2", referencedColumnName="id2")
)
private Brand brand;

【讨论】:

以上是关于具有复合键的 JPA ManyToOne的主要内容,如果未能解决你的问题,请参考以下文章

Spring OneToMany 与复合键的关系与另一个具有复合键的关系

具有复合键的一对多注释映射

级联保存具有外键的实体对象作为复合主键的一部分

尝试插入具有复合主键的记录时出错

具有复合替换键的 PXSelector

使用 Cloudformation 创建具有复合主键的 DynamoDB