JAVA高階程式設計之hibernate框架學習二
hibernate對映關係
對映關係相關屬性詳解
name:屬性的名字,同時是對用類的屬性名字。
table:建立後的表名
class (可選 - 預設是通過反射得到的屬性型別):被關聯的類的名字。
column:主鍵對應的屬性名,key標籤的colum表示外來鍵
-
generator:表示主鍵的生成方式
常見主鍵生成方式
1.increment:主鍵遞增生成,其生成方式與底層資料庫無關,大部分資料庫都支援,該方式的實現機制是在當前應用例項中維持一個變數,以儲存著當前的最大值,之後每次需要生成主鍵的時候將此值加1作為轉。其不足之處是當多個執行緒併發對資料庫表進行寫操作時,可能出現相同的主鍵值,發生主鍵重複的衝突,所以在多執行緒併發操作的時候不應該使用該方法。
<generator class="increment" />
2.identity:與底層資料庫有關,要求資料庫支援Identity,如MySQL中auto_increment,SQL Server中的identity。支援的資料庫有MySQL,SQL Server,DB2,Sybase,但是不支援oracle.支援併發。
<generator class="identity" />
3.assigned:主鍵由外部程式負責生成,無需Hibernate參與。----如果要由程式程式碼來指定主鍵,就採有這種。
<generator class="assigned" />
4.sequence:使用序列生成主鍵,需要底層資料庫支援
在資料庫中建一個序列
create sequence seq_name increment by 1 start with 1; 在對映檔案中指定使用序列的名字 <generator class="sequence"> <param name="sequence">seq_name</param> </generator>
property:普通屬性的標籤
constrained(約束) (可選):表明該類對應的表對應的資料庫表,和被關聯的物件所對應的資料庫表之間,通過一個外來鍵引用對主鍵進行約束。
這個選項影響save()和delete()在級聯執行時的先後順序unique:是在使用hibernate的自動建表的時候才用到,uniq="true"用來指定表中的外來鍵唯一,即給表中的外來鍵新增唯一性約束,保證是一對一的關係。
property-ref:用來指定關聯類的屬性名,這個屬性將會和本類中的主鍵相對應,如果沒有指定,預設使用關聯類的主鍵和本類中的主鍵相對應。
lazy:true/false,session是否延遲查詢所需要的物件的相關屬性
-
cascade(級聯) (可選):表明操作是否從父物件級聯到被關聯的物件。
級聯的型別
lazy="none":在儲存,更新,刪除當前物件的時候忽略其他關聯的物件。是cascade的預設值
lazy="save-update":當通過Session的save(),update(),saveOrUpdate()方法來儲存或者更新當前物件的時候級聯儲存所有關聯的臨時物件,級聯更新所有關聯的遊離物件。
lazy="delete":當通過Session的delete()方法刪除當前物件的時候級聯刪除所有關聯的物件。
lazy="all":包含save-update和delete的行為。
lazy="delete-orphan":刪除所有和當前物件解除關聯關係的物件。(只能在set中配置)
lazy="all-delete-orphan": 包含all和delete-orphan的行為
inverse:負責控制關係,inverse真正的作用是指定由哪一方來維護之間的關聯關係,當一方指定inverse="false"那麼這一方就有責任負責之間的關聯關係。.需要將其中的一方inverse="true",預設為false,只能顯示在<set>放進行設定。
對映關係型別
-
一對一
一個人對應一張身份證,一張身份證對應一個人
person配置檔案資訊:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.briup.day05.one2one"> <class name="Person" table="tbl_person"> <id name="id" column="id"> <generator class="increment" /> </id> <property name="name" /> <!-- 在主方配置一對一 --> <one-to-one name="card" class="Card" /> </class> </hibernate-mapping>
card配置檔案資訊:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.briup.day05.one2one">
<class name="Card" table="tbl_card">
<id name="id" column="id">
<generator class="increment" />
</id>
<property name="number"/>
<property name="address"/>
<many-to-one name="person" class="Person"
unique="true"
column="p_id"></many-to-one>
<!-- column是外來鍵 -->
</class>
</hibernate-mapping>
-
一對多
一位顧客對應多個訂單,多個訂單對應一位顧客
customer配置檔案資訊:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.briup.day05.one2many"> <class name="Customer" table="tbl_customer"> <id name="id" column="id"> <generator class="increment"/> </id> <property name="name"/> <property name="telephone"/> <property name="address"/> <!-- 關聯對映 --> <set name="orders"> <key column="c_id"/> <one-to-many class="Order"/> </set> </class> </hibernate-mapping> *order配置檔案資訊:* <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.briup.day05.one2many"> <class name="Order" table="tbl_order"> <id name="id" column="id"> <generator class="increment"/> </id> <property name="total"/> <property name="orderDate"/> <!-- 關聯對映 --> <many-to-one name="customer" class="Customer" column="c_id" /> </class> </hibernate-mapping>
-
多對多
多個學生對應多門課程,多門課程對應對個學生
由於student和course都是多對多所以配置資訊一樣:
配置檔案資訊:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.briup.day06.many2many"> <class name="Student" table="tbl_student"> <id name="id" column="id"> <generator class="increment" /> </id> <property name="name" /> <property name="age" /> <set name="courses" table="tbl_student_course"> <key column="s_id"> </key> <many-to-many class="Course" column="c_id"></many-to-many> </set> </class> </hibernate-mapping>
在上面的配置檔案中出現了一個table="tab_student_course"這樣的標籤,那麼這個是什麼呢?
在資料庫中如果兩個不同的實體出現了多對多的關係我們要給其中新增一個關係的對應表,我們稱之為橋表,那麼這裡的table="tab_student_course"就是學生表和課程對應的橋表
相關文章
- JavaScript高階程式設計學習(一)之介紹JavaScript程式設計
- Python學習之物件導向高階程式設計Python物件程式設計
- 學習C#高階程式設計之正規表示式C#程式設計
- Javascript高階程式設計 學習筆記JavaScript程式設計筆記
- Hibernate框架學習框架
- 《java學習二》併發程式設計Java程式設計
- Java學習之AWT GUI程式設計JavaGUI程式設計
- Java學習之Swing Gui程式設計JavaGUI程式設計
- 好程式設計師Java學習路線之Spring框架之動態代理程式設計師JavaSpring框架
- UNIX環境高階程式設計習題——第二章程式設計
- 好程式設計師Java教程分享Java面試題之Hibernate程式設計師Java面試題
- PHP高階程式設計:模式、框架與測試PHP程式設計模式框架
- java框架之Hibernate框架知識點整理。Java框架
- 如何成為高階java程式設計師Java程式設計師
- JAVA程式設計學習記錄(API常用類(二))Java程式設計API
- shell程式設計,實戰高階進階教學程式設計
- Hibernate學習筆記二筆記
- Java高階程式設計筆記 • 【第4章 網路程式設計】Java程式設計筆記
- 高階程式設計師——java語言深度解析程式設計師Java
- Unix高階程式設計學習筆記--系統呼叫簡介程式設計筆記
- 《javascript高階程式設計》學習筆記 | 7.3.生成器JavaScript程式設計筆記
- MySQL高階學習筆記(二)MySql筆記
- 好程式設計師Java學習路線之集程式設計師Java
- 好程式設計師Java學習路線分享Java框架怎麼搭建程式設計師Java框架
- c# 程式設計學習(二)C#程式設計
- 程式設計師,請停止學習框架!程式設計師框架
- Java程式設計師學習Rust程式設計 - infoworldJava程式設計師Rust
- 怎麼從初、中級Java程式設計師過渡到高階Java程式設計師?Java程式設計師
- JS高階程式設計第十三章.個人學習筆記JS程式設計筆記
- JS高階程式設計第十一章.個人學習筆記JS程式設計筆記
- JS高階程式設計第十六章.個人學習筆記JS程式設計筆記
- 《javascript高階程式設計》學習筆記 | 21.2.錯誤處理JavaScript程式設計筆記
- 《javascript高階程式設計》學習筆記 | 11.3.非同步函式JavaScript程式設計筆記非同步函式
- 雲端計算學習素材框架,msyql高階操作課件框架
- 好程式設計師Java學習路線之SpringMVC之基本配置程式設計師JavaSpringMVC
- Python 高階程式設計:深入探索高階程式碼實踐Python程式設計
- spark學習筆記--進階程式設計Spark筆記程式設計
- Python學習之IO程式設計Python程式設計
- 好程式設計師大資料學習路線分享高階函式程式設計師大資料函式