首先在开发之中复合主键是一中强烈不建议使用的技术,在任何一张数据表里面如果要设置主键应该只设置一个字段,但是复合主键毕竟属于标准的SQL语法,所以在Hibernate或者是JPA之中也都有复合主键的定义支持。
范例:数据库脚本
-- 删除数据表
DROP TABLE IF EXISTS member;
-- 创建数据表
CREATE TABLE member(
mid VARCHAR(50),
mname VARCHAR(50),
mage INT,
CONSTRAINT pk_mid_name PRIMARY KEY(mid,name)
);
此时设置了两个主键,但是一定要记住一点,主键不应该重复,所以在随后生成Hibernate操作的时候就要观察它生成类的形式。
1 基于HBM文件的配置
范例:定义MemberId类
@SuppressWarnings("serial")
public class MemberId implements java.io.Serializable {
// Fields
private String mid;
private String mname;
}
为了能够确定唯一,在这个MemberId类里面必须要覆写equals()和hashCode()两个方法。
范例:在Member类里面利用MemberId来描述复合主键
@SuppressWarnings("serial")
public class Member implements java.io.Serializable {
// Fields
private MemberId id;
private Integer mage;
}
随后需要观察Member.hbm.xml文件的组成。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="org.lks.pojo.Member" table="member" catalog="hedb">
<!-- 取代的是id元素,表示此时的id是一个复合主键 -->
<composite-id name="id" class="org.lks.pojo.MemberId">
<key-property name="mid" type="java.lang.String">
<column name="mid" length="50" />
</key-property>
<key-property name="mname" type="java.lang.String">
<column name="mname" length="50" />