1) 類中的每個主鍵屬性都對應到數據表中的每個主鍵列。
Hibernate要求具有聯合主鍵的實體類實現Serializable接口,並且重寫hashCode與equals方法,重寫這兩個方法的原因在於Hibernate要根據數據庫的聯合主鍵來判斷某兩行記錄是否是一樣的,如果一樣那麼就認爲是同一個對象,如果不一樣,那麼就認爲是不同的對象。這反映到程序領域中就是根據hashCode與equals方法來判斷某兩個對象是否能夠放到諸如Set這樣的集合當中。聯合主鍵的實體類實現Serializable接口的原因在於使用get或load方法的時候需要先構建出來該實體的對象,並且將查詢依據(聯合主鍵)設置進去,然後作爲get或load方法的第二個參數傳進去即可。
2) 將主鍵所對應屬性提取出一個類(稱之爲主鍵類),並且主鍵類需要實現Serializable接口,重寫equals方法與hashCode方法,原因與上面一樣。
以Student類爲例,實現上述兩種映射聯合主鍵的配置:
2.Student中的兩個屬性作爲聯合主鍵屬性
Student類:
- public class Student implements Serializable {//必須要實現Serializable接口
- private String cardID;//cardID和name映射爲聯合主鍵
- private String name;
- private int age;
- //get、set、hashCode、equals方法省略
- }
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();
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方法省略
- }
- public class Student {
- private int age;
- private PrimaryKey primaryKey;
- //set、get方法省略
- }
- <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());
4.對於以上兩種映射聯合主鍵的方式,反映到數據庫中的表的結構是相同的,student表的內容爲:
轉載請註明出處:http://blog.csdn.net/jialinqiang/article/details/8704538