You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Hibernate映射文件中用两个外键生成复合主键

把Order表的两个外键设为Hibernate复合主键的解决方案

要将applicationId和customerId这两个外键设为Order表的复合主键,需要分两步操作:创建复合主键类,再修改Hibernate映射文件。

1. 编写复合主键类

首先得定义一个实现Serializable接口的复合主键类,里面包含这两个主键字段,并且必须重写equals()和hashCode()方法(Hibernate需要用这两个方法判断主键是否相等):

import java.util.Objects;

public class OrderPK implements Serializable {
    private Long applicationId;
    private Long customerId;

    // 必须有无参构造器
    public OrderPK() {}

    // 带参构造器(可选,方便创建实例)
    public OrderPK(Long applicationId, Long customerId) {
        this.applicationId = applicationId;
        this.customerId = customerId;
    }

    // getter和setter方法
    public Long getApplicationId() {
        return applicationId;
    }

    public void setApplicationId(Long applicationId) {
        this.applicationId = applicationId;
    }

    public Long getCustomerId() {
        return customerId;
    }

    public void setCustomerId(Long customerId) {
        this.customerId = customerId;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        OrderPK orderPK = (OrderPK) o;
        return Objects.equals(applicationId, orderPK.applicationId) &&
               Objects.equals(customerId, orderPK.customerId);
    }

    @Override
    public int hashCode() {
        return Objects.hash(applicationId, customerId);
    }
}

2. 修改Order的Hibernate映射文件

在映射文件中用<composite-id>标签定义复合主键,同时将原来的实体关联与主键字段绑定,注意要给关联标签加上insert="false"和update="false",避免主键字段的更新/插入冲突:

<class name="Order" table="order">
    <!-- 配置复合主键,关联到OrderPK类 -->
    <composite-id name="id" class="OrderPK">
        <key-property name="applicationId" column="applicationId"/>
        <key-property name="customerId" column="customerId"/>
    </composite-id>

    <!-- 关联Application实体,复用主键字段作为外键 -->
    <one-to-one name="application" class="Application">
        <column name="applicationId" insert="false" update="false"/>
    </one-to-one>

    <!-- 关联Customer实体,复用主键字段作为外键 -->
    <many-to-one name="customer" class="Customer" column="customerId" insert="false" update="false" cascade="all"/>
</class>

最后,你的Order实体类需要添加OrderPK类型的id属性,以及对应的application和customer属性,并补充getter/setter方法。

内容的提问来源于stack exchange,提问作者DrunkDragon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 00:15:58