hibernate繼承對映

2021-08-31 12:40:13 字數 2661 閱讀 6753

每棵繼承樹對映成一張表

因為類繼承樹肯定是對應多個類,要把多個類的資訊存放在一張表中,必須有某種機制來區分哪些記錄是屬於哪個類的。

這種機制就是,在表中新增乙個字段,用這個欄位的值來進行區分。用hibernate實現這種策略的時候,有如下步驟:

父類用普通的標籤定義

在父類中定義乙個discriminator,即指定這個區分的字段的名稱和型別

如:子類使用標籤定義,在定義subclass的時候,需要注意如下幾點:

subclass標籤的name屬性是子類的全路徑名

在subclass標籤中,用discriminator-value屬性來標明本子類的discriminator欄位(用來區分不同類的字段)

的值subclass標籤,既可以被class標籤所包含(這種包含關係正是表明了類之間的繼承關係)。

每個具體類對映成一張表

這種策略是使用union-subclass標籤來定義子類的。每個子類對應一張表,而且這個表的資訊是完備的,

即包含了所有從父類繼承下來的屬性對映的字段(這就是它跟joined-subclass的不同之處,

joined-subclass定義的子類的表,只包含子類特有屬性對映的字段)。實現這種策略的時候,有如下步驟:

父類用普通標籤定義即可

子類用標籤定義,在定義union-subclass的時候,需要注意如下幾點:

union-subclass標籤不再需要包含key標籤(與joined-subclass不同)

union-subclass標籤,既可以被class標籤所包含(這種包含關係正是表明了類之間的繼承關係),

也可以與class標籤平行。 當union-subclass標籤的定義與class標籤平行的時候,需要在union-subclass

標籤中,新增extends屬性,裡面的值是父類的全路徑名稱。子類的其它屬性,像普通類一樣,

定義在union-subclass標籤的內部。這個時候,雖然在union-subclass裡面定義的只有子類的屬性,

但是因為它繼承了父類,所以,不需要定義其它的屬性,在對映到資料庫表的時候,依然包含了父類的所

有屬性的對映字段。 

注意:在儲存物件的時候id是不能重複的(不能使用自增生成主鍵) 

每個子類對映成一張表

這種策略是使用joined-subclass標籤來定義子類的。父類、子類,每個類都對應一張資料庫表。

在父類對應的資料庫表中,實際上會儲存所有的記錄,包括父類和子類的記錄;在子類對應的資料庫表中,

這個表只定義了子類中所特有的屬性對映的字段。子類與父類,通過相同的主鍵值來關聯。實現這種策略的時候,

有如下步驟:

父類用普通的標籤定義即可

父類不再需要定義discriminator欄位

子類用標籤定義,在定義joined-subclass的時候,需要注意如下幾點:

joined-subclass標籤的name屬性是子類的全路徑名

joined-subclass標籤需要包含乙個key標籤,這個標籤指定了子類和父類之間是通過哪個欄位來關聯的。

如:,這裡的column,實際上就是父類的主鍵對應的對映欄位名稱。

joined-subclass標籤,既可以被class標籤所包含(這種包含關係正是表明了類之間的繼承關係),

也可以與class標籤平行。 當joined-subclass標籤的定義與class標籤平行的時候,需要在joined-subclass

標籤中,新增extends屬性,裡面的值是父類的全路徑名稱。子類的其它屬性,像普通類一樣,定義在joined-subclass標籤的內部。

component對映

在hibernate中,component是某個實體的邏輯組成部分.

採用component對映的好處:它實現了物件模型的細粒度劃分,層次會更分明,復用率會更高 

hql1、簡單屬性查詢【重要】

* 單一屬性查詢,返回結果集屬性列表,元素型別和實體類中相應的屬性型別一致

* 多個屬性查詢,返回的集合元素是物件陣列,陣列元素的型別和對應的屬性在實體類中的型別一致

陣列的長度取決與select中屬性的個數

* 如果認為返回陣列不夠物件化,可以採用hql動態例項化student物件

2、條件查詢【重要】 

* 可以採用拼字串的方式傳遞引數

* 可以採用 ?來傳遞引數(索引從0開始)

* 可以採用 :引數名 來傳遞引數

* 如果傳遞多個引數,可以採用setparamterlist方法

3、hibernate也支援直接使用sql進行查詢

hibernate lazy策略可以使用在:

* 標籤上,可以取值:true/false

* 標籤上,可以取值:true/false/extra

lazy概念:只有真正使用該物件時,才會建立,對於hibernate而言,正真使用的時候才會發出sql

hibernate支援lazy策略只有在session開啟狀態下有效

標籤上的lazy特性只對普通屬性起作用

hibernate在集合上的lazy策略,可以取值:true/false/extra

標籤上的lazy不會影響到集合上的lazy特性

memberhibernate:單錶的hibernate和struts的整合(必須掌握)

strutscrm:乙個專案的乙個模組,多表的hibernate和struts的整合(必須掌握表和表之間的關係)

Hibernate 繼承對映

繼承對映是將乙個繼承體系對映到資料庫表裡面,繼承實現的三種策略 單錶繼承,每顆類繼承樹使用一張表 一張表 具體表繼承,每個子類一張表 三張表,animal pig bird 類表繼承,每個具體類一張表 兩張表,策略描述 單錶繼承,效率較高,只需查一張表就好,需要新增乙個標記欄位來標記是哪個子類,而且...

Hibernate 繼承關係對映

繼承關係對映 繼承是物件導向程式設計中乙個很重要的特徵,在做物件導向的分析與設計時,經常會設計出具體繼承關聯對映的持久化類。如何把這些持久化類之間的繼承關係對映到關聯式資料庫上的問題已解決。繼承在物件模型中是is a的關係,但在關係模型中,實體之間只有has a的關係,也就是說,繼承在物件模型和關係...

Hibernate的繼承對映

關係模型如下 對映檔案如下 package com.nnngu name animal table t animal lazy false name id class native id column type type string name name name name pig discrimi...