Hibernate筆記整理 一對多(單向)

2021-08-31 22:22:27 字數 3654 閱讀 7380

///

hibernate:

///一對多關聯和多對一關聯在實際應用中式非常普遍的。例如乙個會員(member)可以有多個訂單(order),而每個訂單只能屬於某個特定的會員,這便是乙個典型的一對多關聯。

本示例要用到的兩個pojo類如下:

public class member

public class order

會員(member)擁有多個訂單(order),而每個訂單只能屬於某個特定的會員。

首先來演示和學習一對多的單向關聯。

兩個人pojo的對映檔案如下:

member.hbm.xml:

order.hbm.xml:

在member.hbm.xml中主要的是它的元素,它定義了order作為它的乙個集合屬性。而order.hbm.xml則和普通的對映檔案沒有什麼不同。

下面進行測試:

a、插入資料

public void insert()

檢視hibernate在後台執行的sql語句如下:

hibernate:

insert

into

test_member

(age, name, id)

values

(?, ?, ?)

hibernate:

insert

into

test_order

(name, num, member_id)

values

(?, ?, ?)

hibernate:

update

test_order

setmember_id=?

where

id=?

總共執行了3條sql語句,前兩條是進行資料的插入,第三條將order的外來鍵更新為member的主鍵值。

因為關聯關係時單向的,關聯關聯關係由member來維護,而「多」的一方並不知道它自己和member有任何關係。

在這個例子中,hibernate首先向資料庫插入member的資料,然後插入order的資料(這時候order的外來鍵為

null,如果設定其外來鍵不允許為null的話就會報錯),最後hibernate會傳送一條更新order外來鍵的sql語句,

其值由member的主鍵值而來。由此看出採用這種單向關聯存在著很大的問題,包括效能、是否為空等問題。

b、載入資料

public void getmemberbyid(string id)

檢視後台的sql語句:

hibernate:

select

member0_.id as id5_1_,

member0_.age as age5_1_,

member0_.name as name5_1_,

idcard1_.id as id4_0_,

idcard1_.num as num4_0_,

idcard1_.member_id as member3_4_0_

from

test_member member0_

left outer join

test_idcard idcard1_

on member0_.id=idcard1_.member_id

where

member0_.id=?

hibernate:

select

orders0_.member_id as member4_1_,

orders0_.id as id1_,

orders0_.id as id6_0_,

orders0_.name as name6_0_,

orders0_.num as num6_0_,

orders0_.member_id as member4_6_0_

from

test_order orders0_

where

orders0_.member_id=?

這裡有點要注意:m.getorders()在這裡必須要在載入member物件的session範圍內,否則得話就會出錯,因為session已經關閉。

c、刪除資料

public void delete(string id)

檢視hibernate後台sql語句如下:

hibernate:

select

member0_.id as id5_1_,

member0_.age as age5_1_,

member0_.name as name5_1_,

idcard1_.id as id4_0_,

idcard1_.num as num4_0_,

idcard1_.member_id as member3_4_0_

from

test_member member0_

left outer join

test_idcard idcard1_

on member0_.id=idcard1_.member_id

where

member0_.id=?

hibernate:

select

orders0_.member_id as member4_1_,

orders0_.id as id1_,

orders0_.id as id6_0_,

orders0_.name as name6_0_,

orders0_.num as num6_0_,

orders0_.member_id as member4_6_0_

from

test_order orders0_

where

orders0_.member_id=?

hibernate:

update

test_order

setmember_id=null

where

member_id=?

hibernate:

delete

from

test_order

where

id=?

hibernate:

delete

from

test_member

where

id=?

因為我根據乙個member的主鍵來載入到它的乙個物件例項,然後將其刪除,所以hibernate首先載入member物件及其order集合;因為要刪除order,

所以又更新了order的外來鍵為null,最後刪除order和member。可見刪除乙個會員會執行大量的sql語句,對效能的影響可想而知,並且如果order的外來鍵不允許為null,

比起上面的少了大量的更新語句,顯然效能上要有所提高。

為了能夠達到上述理想情況,使用這種單向關聯是不行的,那就要通過雙向關聯來實現。

注:如果member有上千個訂單的話就要一條一條的刪除訂單,效能上也會受影響,幸好,hibernate提高了乙個系統屬性可以設定成用來進行批量更新。

hibernate.jdbc.batch_size,hibernate官方建議取值在5和30之間。只有當要執行的sql語句到指定的數目後,hibernate才將其提交執行,

這樣減少了與資料互動的次數,從而提高效能。

Hibernate筆記整理 一對一

hibernate 一對一關聯有兩種關聯方式,即 主鍵關聯和外來鍵關聯。member類 public class member idcard類 public class idcard 先對這兩個類解釋一下,member類代表人員,idcard類代表了身份證,這在現實中也是一對一的關係。1 主鍵關聯 ...

hibernate 一對多(多對一)

舉個例子 乙個國家有多個省份,多個省份只有乙個國家,這個就是多對一和一對多,兩者就是看物件的角度問題 多對一關聯對映 在多的一端加入外來鍵指向一的一端,他維護的關係是多指向一 一對多關聯對映 在多的一端加入外來鍵指向一的一端,它維護的關係是一指向多 也就是說一對多和多對一的對映策略是一樣的,只是站的...

hibernate註解一對多 多對一

註解 多對一刪除時 只執行多的一方而一不會改變 新增時考慮 一的一方主鍵是否存在 cascade表示級聯操作 cascadetype.merge級聯更新 cascadetype.persist級聯重新整理 cascadetype.refresh級聯儲存 cascadetype.remove級聯刪除 ...