Hibernate聯合主鍵對映
1) 類中的每個主鍵屬性都對應到資料表中的每個主鍵列。
Hibernate要求具有聯合主鍵的實體類實現Serializable介面,並且重寫hashCode與equals方法,重寫這兩個方法的原因在於Hibernate要根據資料庫的聯合主鍵來判斷某兩行記錄是否是一樣的,如果一樣那麼就認為是同一個物件,如果不一樣,那麼就認為是不同的物件。這反映到程式領域中就是根據hashCode與equals方法來判斷某兩個物件是否能夠放到諸如Set這樣的集合當中。聯合主鍵的實體類實現Serializable介面的原因在於使用get或load方法的時候需要先構建出來該實體的物件,並且將查詢依據(聯合主鍵)設定進去,然後作為get或load方法的第二個引數傳進去即可。
2) 將主鍵所對應屬性提取出一個類(稱之為主鍵類),並且主鍵類需要實現Serializable介面,重寫equals方法與hashCode方法,原因與上面一樣。
以Student類為例,實現上述兩種對映聯合主鍵的配置:
2.Student中的兩個屬性作為聯合主鍵屬性
Student類:
注:可使用MyEclipse中的Sourse-->Gennerate hashCode and equals來使用MyEclipse快速生成hashCode和equals方法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();
注意:主鍵為(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() 到數據庫前,編碼人員手工設置主鍵