hibernate聯合主鍵及映射實體類寫法

1.聯合主鍵的映射規則

1) 類中的每個主鍵屬性都對應到數據表中的每個主鍵列

Hibernate要求具有聯合主鍵的實體類實現Serializable接口,並且重寫hashCodeequals方法,重寫這兩個方法的原因在於Hibernate要根據數據庫的聯合主鍵來判斷某兩行記錄是否是一樣的,如果一樣那麼就認爲是同一個對象,如果不一樣,那麼就認爲是不同的對象。這反映到程序領域中就是根據hashCode與equals方法來判斷某兩個對象是否能夠放到諸如Set這樣的集合當中。聯合主鍵的實體類實現Serializable接口的原因在於使用get或load方法的時候需要先構建出來該實體的對象,並且將查詢依據(聯合主鍵)設置進去,然後作爲get或load方法的第二個參數傳進去即可。

2) 將主鍵所對應屬性提取出一個類(稱之爲主鍵類),並且主鍵類需要實現Serializable接口,重寫equals方法與hashCode方法,原因與上面一樣。

以Student類爲例,實現上述兩種映射聯合主鍵的配置:

2.Student中的兩個屬性作爲聯合主鍵屬性

Student類:

[java] view plaincopy
  1. public class Student implements Serializable {//必須要實現Serializable接口  
  2.   
  3.     private String cardID;//cardID和name映射爲聯合主鍵  
  4.     private String name;  
  5.     private int age;  
  6.         //get、set、hashCode、equals方法省略  
  7. }  
注:可使用MyEclipse中的Sourse-->Gennerate hashCode and equals來使用MyEclipse快速生成hashCode和equals方法

Student.hbm.xml配置:

[html] view plaincopy
  1. <class name="bean.Student" table="student">  
  2.         <composite-id><!--聯合主鍵,student表中的主鍵爲(student_name,card_id)-->  
  3.            <key-property name="name" column="student_name" type="string"></key-property><!--name及cardID爲Student類中的屬性-->  
  4.            <key-property name="cardID" column="card_id" type="string"></key-property>  
  5.         </composite-id>  
  6.         <property name="age" column="student_age" type="int"></property>  
  7. </class>  
保存對象:

[java] view plaincopy
  1. tx=session.beginTransaction();  
  2.   
  3. Student s1=new Student();  
  4. s1.setName("lisi");  
  5. s1.setAge(22);  
  6. s1.setCardID("711");  
  7. System.out.println(s1);  
  8. session.save(s1);  
  9. tx.commit();  
注意:主鍵爲(card_id,student_id)若連續執行上述的保存語句兩次,當然會拋異常,應爲主鍵重複:   
           org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
3.將Student類中的兩個主鍵屬性提取爲一個新的類PrimaryKey,即主鍵類

主鍵類PrimaryKey:

[java] view plaincopy
  1. public class PrimaryKey implements Serializable{  
  2.   
  3.     private String cardID;  
  4.     private String name;  
  5.     //get、set、hashCode、equals方法省略  
  6. }  
Student類中含有PrimaryKey類型的屬性及對應set、get方法:

[java] view plaincopy
  1. public class Student  {  
  2.     private int age;  
  3.     private PrimaryKey primaryKey;  
  4.         //set、get方法省略  
  5. }  
Student.hbm.xml文件中的配置:

[html] view plaincopy
  1. <class name="bean.Student" table="student">  
  2.     <composite-id name="primaryKey" class="bean.PrimaryKey"><!--PrimaryKey爲我們自定義的主鍵類-->  
  3.        <key-property name="name" column="student_name" type="string"></key-property><!--name及cardID爲PrimaryKey類中的屬性-->  
  4.        <key-property name="cardID" column="card_id" type="string"></key-property>  
  5.     </composite-id>  
  6.     <property name="age" column="student_age" type="int"></property>  
  7. </class>  
保存對象:

[java] view plaincopy
  1. tx=session.beginTransaction();  
  2.   
  3.  Student s1=new Student();  
  4.  s1.setAge(23);  
  5.  PrimaryKey p=new PrimaryKey();  
  6.  p.setCardID("102");  
  7.  p.setName("zhangsan");  
  8.  s1.setPrimaryKey(p);  
  9.  session.save(s1);  
  10.  tx.commit();  

同樣,對於上述代碼的重複執行也會導致主鍵重複拋出異常。

查詢:

[java] view plaincopy
  1. PrimaryKey p=new PrimaryKey();  
  2. p.setCardID("711");  
  3. p.setName("lisi");  
  4. Student s=(Student)session.get(Student.class,p);//所以PrimaryKey要實現Serializable接口  
  5. System.out.println(s.getAge());  

4.對於以上兩種映射聯合主鍵的方式,反映到數據庫中的表的結構是相同的,student表的內容爲:


轉載請註明出處:http://blog.csdn.net/jialinqiang/article/details/8704538

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章