hibernate映射复合主键-1

来源:互联网 发布:金贵洗浴软件 编辑:程序博客网 时间:2024/06/06 05:18
联合主键的映射规则
1:类中的每个主键属性都对应到数据库中的每个主键列。

Hiberanate要求具有联合主键的实体类实现Serializable接口,并且重写hashCode和equals方法,重写这两个方法的原因在于hibernate要根据数据库的联合主键来判断某两行的记录是否一样的,如果一样那么就认为是同一个对象,如果不一样,那么就认为是不同的对象。这就反映到程序领域中就是根据hashCode和equals方法来判断某二个对象是否能够放到诸如Set这样的集合中。联合主键的实体类实现Serializable接口的原因在于使用get或者load方法的时候需要构建出改实体的对象,并将查询的依据(联合主键)设置进去,然后作为get或者load方法的第二个参数传递进去即可。

package model;import java.io.Serializable;public class Student implements Serializable {private String cardId;private String name;private int age;public String getCardId() {return cardId;}public void setCardId(String cardId) {this.cardId = cardId;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((cardId == null) ? 0 : cardId.hashCode());result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Student other = (Student) obj;if (cardId == null) {if (other.cardId != null)return false;} else if (!cardId.equals(other.cardId))return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}}

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name = "model.Student" table = "student" lazy="true"><composite-id><key-property name="cardId" column = "cardId" type = "string"></key-property><key-property name = "name" column = "name" type = "string"></key-property></composite-id><property name="age" column = "age" type = "integer"></property></class></hibernate-mapping>


package model;import org.hibernate.cfg.Configuration;import org.hibernate.tool.hbm2ddl.SchemaExport;/** *  create table student (cardId varchar(255) not null, name varchar(255) not null, age integer, primary key (cardId, name)) * */public class Create {public static void main(String[] args) {SchemaExport export = new SchemaExport(new Configuration().configure());export.create(true, true);}}
package model;import org.hibernate.Session;import org.hibernate.Transaction;public class Test {public static void main(String[] args) {save();}static void save () {Session session = HibernateUtil.getSession();Transaction tx = null;try {tx = session.beginTransaction();Student student = new Student ();student.setAge(660000);student.setCardId("123");student.setName("张三");session.save(student);tx.commit();}catch (Exception ex) {ex.printStackTrace();if (null != tx) {tx.rollback();}}finally {HibernateUtil.close(session);}}}
save():

Hibernate: insert into student (age, cardId, name) values (?, ?, ?)

2:将主键所对应的属性提取出一个类(称之为主键类),并且主键类需要实现Serializable接口,重写equals方法与hashcode方法。

package model;import java.io.Serializable;public class StudentPrimaryKey implements Serializable {private String cardId;private String name;public String getCardId() {return cardId;}public void setCardId(String cardId) {this.cardId = cardId;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((cardId == null) ? 0 : cardId.hashCode());result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;StudentPrimaryKey other = (StudentPrimaryKey) obj;if (cardId == null) {if (other.cardId != null)return false;} else if (!cardId.equals(other.cardId))return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}}

package model;import java.io.Serializable;public class Student{private StudentPrimaryKey studentPrimaryKey;private int age;public StudentPrimaryKey getStudentPrimaryKey() {return studentPrimaryKey;}public void setStudentPrimaryKey(StudentPrimaryKey studentPrimaryKey) {this.studentPrimaryKey = studentPrimaryKey;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
package model;import org.hibernate.Session;import org.hibernate.Transaction;public class Test {public static void main(String[] args) {//save();fetch();}static void save () {Session session = HibernateUtil.getSession();Transaction tx = null;try {tx = session.beginTransaction();Student student = new Student ();student.setAge(100);StudentPrimaryKey studentPrimaryKey = new StudentPrimaryKey();studentPrimaryKey.setCardId("123");studentPrimaryKey.setName("lisi");student.setStudentPrimaryKey(studentPrimaryKey);session.save(student);tx.commit();}catch (Exception ex) {ex.printStackTrace();if (null != tx) {tx.rollback();}}finally {HibernateUtil.close(session);}}static void fetch () {Session session = HibernateUtil.getSession();Transaction tx = null;try {tx = session.beginTransaction();StudentPrimaryKey studentPrimaryKey = new StudentPrimaryKey();studentPrimaryKey.setCardId("123");studentPrimaryKey.setName("lisi");Student student = (Student)session.get(Student.class, studentPrimaryKey);System.out.println(student.getAge());session.save(student);tx.commit();}catch (Exception ex) {ex.printStackTrace();if (null != tx) {tx.rollback();}}finally {HibernateUtil.close(session);}}}



package model;import org.hibernate.cfg.Configuration;import org.hibernate.tool.hbm2ddl.SchemaExport;/** *  create table student (cardId varchar(255) not null, name varchar(255) not null, age integer, primary key (cardId, name)) */public class Create {public static void main(String[] args) {SchemaExport export = new SchemaExport(new Configuration().configure());export.create(true, true);}}