联合主键的映射规则:
两种方法:
1) 类中的每个主键属性都对应到数据表中的每个主键列。Hibernate要求具有联合主键的实体类实现Serializable接口,并且重写hashCode与equals方法,重写这两个方法的原因在于Hibernate要根据数据库的联合主键来判断某两行记录是否是一样的,如果一样那么就认为是同一个对象,如果不一样,那么就认为是不同的对象。这反映到程序领域中就是根据hashCode与equals方法来判断某两个对象是否能够放到诸如Set这样的集合当中。联合主键的实体类实现Serializable接口的原因在于使用get或load方法的时候需要先构建出来该实体的对象,并且将查询依据(联合主键)设置进去,然后作为get或load 方法的第二个参数传进去即可。
2) 将主键所对应属性提取出一个类(称之为主键类),并且主键类需要实现Serializable接口,重写equals方法与hashCode方法,原因与上面一样。
下面分别是两种方法的实例:
第一种方法:
Student.java:实现Serrializable接口
private String id;
private String cardId;
private String name;
为其生成set、get方法,并为cardId和name生成hashcode和equals方法。
Student.hbm.xml:
<class name="com.songjinghao.hibernate.Student"table="student">
<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>
HibernateTest.java:
//插入数据到数据库
// Student student = new Student();
// student.setName("zhangsan");
// student.setCardId("123456");
// student.setAge(30);
// session.save(student);
//从数据库查询数据
Student studentPrimaryKey = new Student();
studentPrimaryKey.setCardId("123456");
studentPrimaryKey.setName("zhangsan");
Student student = (Student)session.get(Student.class,studentPrimaryKey);
System.out.println(student.getAge());
System.out.println(studentPrimaryKey.getAge());
第二种方法:
StudentPrimaryKey.java: (主键类)实现Serrializable接口
private String cardId;
private String name;
为其生成set、get方法,并生成hashcode和equals方法。
Student.java:
private StudentPrimaryKey studentPrimaryKey;
privateintage;
为其生成set、get方法。
Student.hbm.xml:
<class name="com.songjinghao.hibernate.Student"table="student">
<composite-id name="studentPrimaryKey"class="com.songjinghao.hibernate.StudentPrimaryKey">
<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>
HibernateTest.java:
//插入数据到数据库
// Student student = new Student();
// StudentPrimaryKey studentPrimaryKey = new StudentPrimaryKey();
// studentPrimaryKey.setCardId("123456");
// studentPrimaryKey.setName("zhangsan");
// student.setAge(30);
// student.setStudentPrimaryKey(studentPrimaryKey);
// session.save(student);
//从数据库查询数据
StudentPrimaryKey studentPrimaryKey = newStudentPrimaryKey();
studentPrimaryKey.setCardId("123456");
studentPrimaryKey.setName("zhangsan");
Student student = (Student)session.get(Student.class,studentPrimaryKey);
System.out.println(student.getAge());
System.out.println(student.getStudentPrimaryKey().getName());