一般来说,应用中的主键都是以表中的一列作为主键(也有无主键的表),独立主键的使用在hibernate中已经比较常见了,复合主键使用的场合一般用于复杂记录的时候。
例:在一个企业中,可能有两个或者更多的人同名,此时名称已经区分不出他们了,但是可以区分的是他们的身份证编号也就是ID号
在hibernate中也可以使用这种方式加以区分,就成为复合主键的映射
将需要的主键独立成一个类
示例如下
hibernate.cfg.xml 文件
测试方法
例:在一个企业中,可能有两个或者更多的人同名,此时名称已经区分不出他们了,但是可以区分的是他们的身份证编号也就是ID号
在hibernate中也可以使用这种方式加以区分,就成为复合主键的映射
将需要的主键独立成一个类
示例如下
package vo;
/**
* 实体类
* @author Wang_yx
*
*/
public class Person {
private PersonPK pk = new PersonPK();
private String personEmail;
private String personAddress;
public PersonPK getPk() {
return pk;
}
public void setPk(PersonPK pk) {
this.pk = pk;
}
public String getPersonEmail() {
return personEmail;
}
public void setPersonEmail(String personEmail) {
this.personEmail = personEmail;
}
public String getPersonAddress() {
return personAddress;
}
public void setPersonAddress(String personAddress) {
this.personAddress = personAddress;
}
}
package vo;
/**
* 复合主键类必须实现序列化接口
* @author Wang_yx
*
*/
public class PersonPK implements java.io.Serializable{
private Integer id;
private String personName;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getPersonName() {
return personName;
}
public void setPersonName(String personName) {
this.personName = personName;
}
}
hibernate.cfg.xml 文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="vo.Person">
<!-- 复合主键的映射 此处的name属性必须和实体中的对象名一致-->
<composite-id name="pk">
<key-property name="id" column="id"></key-property>
<key-property name="personName" column="personname"></key-property>
</composite-id>
<!-- 普通属性的映射 -->
<property name="personEmail" column="personemail"></property>
<property name="personAddress" column="personaddress"></property>
</class>
</hibernate-mapping>
测试方法
package test;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import vo.Person;
import vo.PersonPK;
public class HibernateTest {
private static Configuration config = new Configuration().configure();
private static SessionFactory factory = null;
static{
factory = config.buildSessionFactory();
}
public static void loadPerson(){
Session session = factory.openSession();
Transaction tr = session.getTransaction();
PersonPK pk = new PersonPK();
pk.setId(new Integer(1));
pk.setPersonName("张三");
try{
tr.begin();
Person person = (Person) session.get(Person.class,pk);
if(person!=null){
System.out.print(person.getPersonAddress() + " ");
System.out.println(person.getPersonEmail());
}
tr.commit();
}catch(HibernateException e){
e.printStackTrace();
}finally{
session.close();
}
}
/**
* 复合主键测试
*/
public static void main(String[] args) {
loadPerson();
}
}