hibernate复合主键映射(基础应用)
一般来说,应用中的主键都是以表中的一列作为主键(也有无主键的表),独立主键的使用在hibernate中已经比较常见了,复合主键使用的场合一般用于复杂记录的时候。
例:在一个企业中,可能有两个或者更多的人同名,此时名称已经区分不出他们了,但是可以区分的是他们的身份证编号也就是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;}}
<?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();}}