///
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級聯刪除 ...