1.聯合主鍵的映射規則數據庫
1) 類中的每一個主鍵屬性都對應到數據表中的每一個主鍵列。session
Hibernate要求具備聯合主鍵的實體類實現Serializable接口,而且重寫hashCode與equals方法,重寫這兩個方法的緣由在於Hibernate要根據數據庫的聯合主鍵來判斷某兩行記錄是不是同樣的,若是同樣那麼就認爲是同一個對象,若是不同,那麼就認爲是不一樣的對象。這反映到程序領域中就是根據hashCode與equals方法來判斷某兩個對象是否可以放到諸如Set這樣的集合當中。聯合主鍵的實體類實現Serializable接口的緣由在於使用get或load方法的時候須要先構建出來該實體的對象,而且將查詢依據(聯合主鍵)設置進去,而後做爲get或load方法的第二個參數傳進去便可。spa
2) 將主鍵所對應屬性提取出一個類(稱之爲主鍵類),而且主鍵類須要實現Serializable接口,重寫equals方法與hashCode方法,緣由與上面同樣。.net
以Student類爲例,實現上述兩種映射聯合主鍵的配置:hibernate
2.Student中的兩個屬性做爲聯合主鍵屬性xml
Student類:對象
public class Student implements Serializable {//必需要實現Serializable接口blog
private String cardID;//cardID和name映射爲聯合主鍵
private String name;
private int age;
//get、set、hashCode、equals方法省略
}接口
注:可以使用MyEclipse中的Sourse-->Gennerate hashCode and equals來使用MyEclipse快速生成hashCode和equals方法ip
Student.hbm.xml配置:
<class name="bean.Student" table="student">
<composite-id><!--聯合主鍵,student表中的主鍵爲(student_name,card_id)-->
<key-property name="name" column="student_name" type="string"></key-property><!--name及cardID爲Student類中的屬性-->
<key-property name="cardID" column="card_id" type="string"></key-property>
</composite-id>
<property name="age" column="student_age" type="int"></property>
</class>
保存對象:
tx=session.beginTransaction();
Student s1=new Student();
s1.setName("lisi");
s1.setAge(22);
s1.setCardID("711");
System.out.println(s1);
session.save(s1);
tx.commit();
注意:主鍵爲(card_id,student_id)若連續執行上述的保存語句兩次,固然會拋異常,應爲主鍵重複:
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
3.將Student類中的兩個主鍵屬性提取爲一個新的類PrimaryKey,即主鍵類
主鍵類PrimaryKey:
public class PrimaryKey implements Serializable{
private String cardID;
private String name;
//get、set、hashCode、equals方法省略
}
Student類中含有PrimaryKey類型的屬性及對應set、get方法:
public class Student {
private int age;
private PrimaryKey primaryKey;
//set、get方法省略
}
Student.hbm.xml文件中的配置:
<class name="bean.Student" table="student">
<composite-id name="primaryKey" class="bean.PrimaryKey"><!--PrimaryKey爲咱們自定義的主鍵類-->
<key-property name="name" column="student_name" type="string"></key-property><!--name及cardID爲PrimaryKey類中的屬性-->
<key-property name="cardID" column="card_id" type="string"></key-property>
</composite-id>
<property name="age" column="student_age" type="int"></property>
</class>
保存對象:
tx=session.beginTransaction();
Student s1=new Student();
s1.setAge(23);
PrimaryKey p=new PrimaryKey();
p.setCardID("102");
p.setName("zhangsan");
s1.setPrimaryKey(p);
session.save(s1);
tx.commit();
一樣,對於上述代碼的重複執行也會致使主鍵重複拋出異常。
查詢:
PrimaryKey p=new PrimaryKey();
p.setCardID("711");
p.setName("lisi");
Student s=(Student)session.get(Student.class,p);//因此PrimaryKey要實現Serializable接口
System.out.println(s.getAge());
轉載請註明出處:http://blog.csdn.net/jialinqiang/article/details/8704538