如何在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
相关产品推荐
相关产品推荐

