1. 程式人生 > >Hibernate聯合主鍵對映

Hibernate聯合主鍵對映

1.聯合主鍵的對映規則

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

Hibernate要求具有聯合主鍵的實體類實現Serializable介面,並且重寫hashCodeequals方法,重寫這兩個方法的原因在於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方法省略
}
注:可使用MyEclipse中的Sourse-->Gennerate hashCode and equals來使用MyEclipse快速生成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();
注意:主鍵為(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());
4.對於以上兩種對映聯合主鍵的方式,反映到資料庫中的表的結構是相同的,student表的內容為:

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

相關推薦

Hibernate聯合對映

1.聯合主鍵的對映規則1) 類中的每個主鍵屬性都對應到資料表中的每個主鍵列。 Hibernate要求具有聯合主鍵的實體類實現Serializable介面,並且重寫hashCode與equals方法,重寫這兩個方法的原因在於Hibernate要根據資料庫的聯合主鍵來判斷某兩行

hibernate 聯合

blog package site http Coding logs override ide pac xml配置 需要一個主鍵類: package com.bxw.entity; import java.io.Serializable; public class

hibernate 聯合出現MySQLIntegrityConstraintViolationException錯誤

問題 今天在使用SSH框架做一個專案中的級聯插入時,報一個錯誤(root error,其他錯誤很多,不過都是因為這個引起)“com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationExce

hibernate對映

在hibernate中,表結構如果沒有主鍵的話,對映時是會把所有的欄位預設為類似的聯合主鍵形式,就到時候就會產生2個實體類,1個人實體ID,另外一個則為真正的資料欄位 在查詢時有可能會產生一些問題, 例如,空指標,獲取的list有長度,但是實際陣列卻為空 這是一個很惱火的問題

hibernate聯合生成策略以及一對多配置

1:一般能用一個欄位做主鍵的就不要用兩個欄位,不過不可避免的會遇到要用兩個欄位做主鍵,此時要用hibernate,可以使用聯合主鍵。如圖:要用id和name做主鍵 辦法:單獨設計一個類,起名StudentPK,在該類必須重寫equals,hashcode,實現Ser

Hibernate註解對映聯合的三種主要方式

聯合主鍵用Hibernate註解對映方式主要有三種: 第一、將聯合主鍵的欄位單獨放在一個類中,該類需要實現java.io.Serializable介面並重寫equals和hascode,再將該類註解為@Embeddable,最後在主類中(該類不包含聯合主鍵類中的欄位)儲存

hibernate MTM 聯合

hash ret hbm.xml utf oct import override 映射 ping //適用於表裏沒有其他列,只有主鍵 //Course.java實體類 package com.tao.pojo; import java.util.HashSet; imp

Hibernate學習筆記(三)----ID生成策略、聯合

一、ID生成策略(參考hibernate_0400_ID) 1)xml生成id使用generator屬性          <idname="id" >          <generatorclass="native"></generator

Hibernate基於的單項,雙向多對多對映關係

今天我們來一起談論下hibernate的基於主鍵的單項,雙向多對多對映關係 首先多對多都是基於主鍵的,沒有基於外來鍵的說法 1.基於主鍵的單項多對多 在這裡就是說中間stuobject是一張關係表,將兩張表的主鍵進行關聯,形成了多對多的關係 程式碼如

hibernate聯合

hibernate 自動建立表時必須有主鍵id,如果沒有可以在該列屬性前加標籤@Id;但主鍵是聯合主鍵時,hibernate會建立兩個實體類:一個為聯合主鍵的實體類,另一個為聯合主鍵和其他非主鍵的屬性的實體類。 今天講的就是聯合主鍵的情況 hibernate

Hibernate之複合對映

一,概述 複合主鍵也是開發中經常遇到的需求,這篇部落格就是關於複合主鍵對映,開始吧! 二,實體類準備 1)複合主鍵類 package com.bighuan.d_compositeKey; import java.io.Serializable; /** * 複合主

Hibernate中用到聯合的使用方法,為何要序列化,為何要重寫hashcode 和 equals 方法

聯合主鍵用Hibernate註解對映方式主要有三種: 第一、將聯合主鍵的欄位單獨放在一個類中,該類需要實現java.io.Serializable介面並重寫equals和hascode,再將該類註解為@Embeddable,最後在主類中(該類不包含聯合主鍵類中的欄位)儲存該

Hibernate】--一對一關聯、聯合

一、資料模型             1.學生資訊模型(編號、名稱、身份資訊) public class Student implements java.io.Serializable{ private static final long serialVersionUI

Hibernate初學者---schemaExport自動生成聯合關聯資料表

Hibernate 版本: v5.2.10 Eclipse版本:v4.7.1 JDK版本: v1.8 MySQL版本:v5.7 OPJO類一, package com.bak.bum.u

NHibernate 對映基礎(第三篇) 簡單對映聯合

 NHibernate完全靠配置檔案獲取其所需的一切資訊,其中對映檔案,是其獲取資料庫與C#程式關係的所有資訊來源。 一、簡單對映   先來看一張表:      對映檔案Product.hbm.xml: ?xml version="1.0" encoding="

Hibernate中多屬性構成複合對映

目錄: 1. 實現方式一:將複合主鍵對應的屬性與實體其他普通屬性放在一起 2. 實現方式二:將主鍵屬性提取到一個主鍵類中,實體類只需包含主鍵類的一個引用 在日常開發中會遇到這樣一種情況,資料庫中的某張表需要多個欄位列才能唯一確定一行記錄,這時表需要使用複合主鍵。面

使用Hibernate配置聯合的兩種方式

1.主鍵欄位和非主鍵欄位在同一個實體類中,Hibernate配置檔案如下<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibe

hybris items.xml 中表的聯合實現

實現 have option 字段 reat direct combined 指定 org 在 items.xsd中是這麽定義 unique的 <xs:attribute name="unique" type="xs:boolean" use="optional"&g

Oracle創建聯合

bsp font acl con pan span tex size 主鍵 先創建個表: 1)create table test ( sno char(12), name char(4), CONSTRAINT PK_TAB PRIMARY KEY (sno,

Hibernate生成策略小總結

rem 時間值 多線程 class 判斷 acl 選擇 hiberna bsp 主鍵生成策略大致分兩種: 手工控制策略 自動生成策略【框架自動生成和數據庫自動生成】 手工控制策略: assigned:類型是任意的,需要在 save() 到數據庫前,編碼人員手工設置主鍵