xml:composite-id
要重写equals,hashCode方法, 还要序列化
1. 新建一个主键类: StudentPK.java, 注意需要序列化.还要重写equals和hashCode:
package com.bjsxt.hibernate; public class StudentPK implements java.io.Serializable{
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o){
if(o instanceof StudentPK){
StudentPK pk=(StudentPK)o;
if(this.id==pk.getId()&&this.name.equals(pk.getName())){
return true;
}
}
return false;
}
@Override
public int hashCode(){
return this.name.hashCode();
}
}
2. 删掉Student.java里的id和name的set和get方法, 新建一个主键对象及setter和getter:
package com.bjsxt.hibernate; public class Student {
private StudentPK pk;
private int age;
public StudentPK getPk() {
return pk;
}
public void setPk(StudentPK pk) {
this.pk = pk;
} public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
3. junit的测试方法改成:
@Test
public void testStudentSave() {
StudentPK pk=new StudentPK();
pk.setId(1);
pk.setName("zhangsan");
Student s =new Student();
s.setPk(pk);
s.setAge(23); Session session = sf.openSession();
session.beginTransaction();
session.save(s);
session.getTransaction().commit();
session.close();
}
4. Student.hbm.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 package="com.bjsxt.hibernate">
<class name="Student" table="_student">
<!-- <id name="id">
<generator class="native"></generator>
</id>
<property name="name"/> -->
<composite-id name="pk" class="com.bjsxt.hibernate.StudentPK">
<key-property name="id"></key-property>
<key-property name="name"></key-property>
</composite-id> <property name="age"/>
</class>
</hibernate-mapping>