hibernate關聯級別策略

2021-10-06 01:53:39 字數 3275 閱讀 1917

實體關係:客戶和聯絡人之間是一對多的關係

主表:cst_customer,客戶的cust_id作為聯絡人的外來鍵

從表:cst_linkman,乙個客戶可以對應多個聯絡人

customer物件中有linkmens集合

linkman物件中有customer物件

有兩種:集合關聯策略、屬性關聯策略

集合策略:在customer.hbm.xml中配置

fetch屬性:決定載入策略:使用什麼型別的sql語句載入集合資料

select:預設值,單錶查詢載入

join:使用多表查詢載入集合

subselect:使用子查詢載入集合

lazy屬性:決定是否延遲載入

true

:延遲載入(預設),懶載入

false:立即載入

extra:極其懶惰

<

class

name

="customer" table=

"cst_customer" lazy=

"true"

>

//這裡lazy表時customer物件使用時候才載入sql語句執行..

....各種其他配置

"linkmens" lazy=

"extra" fetch=

"subselect"

>

"lkm_cust_id"

>

<

/key>

="linkman"

/>

<

/set>

<

/class

>

關聯屬性策略:在linkman.hbm.xml中配置

fetch:決定載入的sql語句

select預設值,單錶查詢

join多表查詢

lazy:決定載入時機

false

:立即載入

proxy:載入時機由別人(customer物件)替我決定(預設值)

<

class

name

="linkman" table=

"cst_linkman"

>..

....其他配置

"customer" column=

"lkm_cust_id"

class

="customer"

fetch=

"select" lazy=

"proxy"

>

<

/many-to-one>

<

/class

>

3.1集合策略
//集合級別的關聯

//fetch:select 單錶查詢

//lazy:true 使用時才載入集合資料

@test

public

void

fun1()

//集合級別的關聯

//fetch:select 單錶查詢

//lazy:false 立即載入載入集合資料

@test

public

void

fun2()

//集合級別的關聯

//fetch:select 單錶

//lazy:extra極其懶惰 其實跟懶惰沒啥區別

@test

public

void

fun3()

//集合級別的關聯

//fetch:join 多表查詢

//lazy:true|false|extra 失效。立即載入,一口氣全查出來

@test

public

void

fun4()

//集合級別的關聯

//fetch:subset 子查詢

//lazy:true 懶載入

@test

public

void

fun5()

//----------------------------------

tx.commit()

; session.

close()

;}

//集合級別的關聯

//fetch:subset 子查詢

//lazy:false 立即載入

@test

public

void

fun6()

//----------------------------------

tx.commit()

; session.

close()

;}

//集合級別的關聯

//fetch:subset 子查詢

//lazy:extra 極其懶惰

@test

public

void

fun7()

//----------------------------------

tx.commit()

; session.

close()

;}

3.2關聯屬性策略
//屬性的關聯級別

//fetch:select單錶查詢

//lazy:proxy

//customer為true:使用時候載入

//false時候就是立即載入,一口氣載入linkman和customer兩個單錶查詢

public

void

fun1()

//屬性的關聯級別

//fetch:join多表查詢

//lazy:失效了額,因為是多表查詢,一下子就要把兩個都查出來

public

void

fun2()

為了提高效率,fetch的選擇上應該選擇select(不要一下子全部查出來,會占用資源),lazy的取值應該選擇true(懶載入,用到才載入(這裡就用到了**的機制來強化實體類的功能:使用實體的某個未初始化的屬性的時候會自動去執行sql查詢))。而這兩個屬性都是預設值。

no-session問題怎麼解決:

擴大session的作用範圍,使用filter***進行擴充套件

Hibernate關聯對映

單向關聯關係 單向1 1 和單向n 1配置唯一不一樣的地方是在many to one的標籤上加上unique true 即可完成1 1的對映 單向1 n public class person public int getid public void setid int id public stri...

Hibernate關聯對映

關聯對映分為 多對一關聯對映 一對一關聯對映 唯一外來鍵關聯 主鍵關聯 一對多關聯對映 多對多關聯對映 根據關聯關係鏈結的雙方是否能夠導航到彼此,我們將關聯關係分為單向關聯和雙向關聯 1.多對一關聯對映 many to one 我們使用元素來配置多對一關聯關係 name 待對映的持久化類的屬性名。c...

Hibernate 檢索策略

在預設情況下,當hibernate從資料庫中載入物件時,會同時載入所有關聯的物件.但實際應用中可能不需要使用其關聯的物件,這樣就可能通過設定hibernate的檢索策略,來優化檢索效能.hiberante提供了3種檢索策略 1 立即檢索 2 延遲檢索 3 迫切左外連線檢索 下面先從概念上去理解,先在...