Hibernate筆記整理 一對一

2021-08-31 22:22:27 字數 3126 閱讀 8760

///

hibernate:

///一對一關聯有兩種關聯方式,即:主鍵關聯和外來鍵關聯。

member類:

public class member

idcard類:

public class idcard

先對這兩個類解釋一下,member類代表人員,idcard類代表了身份證,這在現實中也是一對一的關係。

///1、主鍵關聯

member. hbm.xml的主要片段如下:

.........

idcard.hbm.xml的配置如下:

member

至此,所有的配置工作已經完成。

測試進行測試:

a、新增資料

public void insert()

後台hibernate執行的sqlserver語句是:

hibernate: insert into test_member (age, name, id) values (?, ?, ?)

hibernate: insert into test_idcard (num, id) values (?, ?)

儲存idcard時使用idcard物件中member物件的id來為自己的id賦值的。你現在可以檢視資料庫,裡面兩個表的主鍵值相同。

b、載入資料

public void getmemberbyid(string id)

後台hibernate執行的sql語句是:

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_

from

test_member member0_

left outer join

test_idcard idcard1_

on member0_.id=idcard1_.id

where

member0_.id=?

可以看出缺省採用的左外連線(左邊表的所有行在右邊沒有得到匹配,那麼右邊表設定為null)的查詢。

如果把member.hbm.xml中做些改動如:

再次執行查詢sql語句如下:

hibernate:

select

member0_.id as id5_0_,

member0_.age as age5_0_,

member0_.name as name5_0_

from

test_member member0_

where

member0_.id=?

hibernate:

select

idcard0_.id as id4_0_,

idcard0_.num as num4_0_

from

test_idcard idcard0_

where

idcard0_.id=?

可以看出生成了兩條sql語句,明顯要比一條的效能低一些。

c、刪除操作

hibernate:

select

member0_.id as id5_0_,

member0_.age as age5_0_,

member0_.name as name5_0_

from

test_member member0_

where

member0_.id=?

hibernate:

select

idcard0_.id as id4_0_,

idcard0_.num as num4_0_

from

test_idcard idcard0_

where

idcard0_.id=?

hibernate:

delete

from

test_idcard

where

id=?

hibernate:

delete

from

test_member

where

id=?

前兩條sql語句是載入member和關聯的idcard物件。由於在測試載入資料時改變了抓取資料方式為fetch="select"所以生成了兩條,

如果改為預設(fetch="join")則只生成一條,並且採用的是左外連線方式。在刪除**中,我只是刪除了member,但是檢視資料庫和

後台的sql語句看出也把idcard資料刪除了,這是因為我在member.hbm.xml中的設定了cascade="all"。如果不

設定(預設為「none」),則只會刪除member物件,而不會級聯刪除idcard物件。

注意:在這個例子中,一定要注意新增資料、刪除資料的先後順序。新增資料必須先新增member(因為idcard的主鍵由member而來),

刪除資料必須先刪除idcard(因為在idcard.hbm.xml中設定了constrained="true"而使得兩個表之間有了約束)。

2、外來鍵關聯

使用外來鍵關聯,我們還是使用這兩個pojo類,只是其對映檔案有所調整。調整後的對映檔案如下:

member.hbm.xml:

......

idcard.hbm.xml:

依然採用上面的測試**進行測試:

a、插入資料

後台hibernate執行的sql語句

hibernate:

insert

into

test_member

(age, name, id)

values

(?, ?, ?)

hibernate:

insert

into

test_idcard

(num, member_id, id)

values

(?, ?, ?)

idcard的外來鍵來自member的主鍵。

b、載入資料

同上c、刪除資料

同上

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

hibernate 一對多關聯和多對一關聯在實際應用中式非常普遍的。例如乙個會員 member 可以有多個訂單 order 而每個訂單只能屬於某個特定的會員,這便是乙個典型的一對多關聯。本示例要用到的兩個pojo類如下 public class member public class order 會...

hibernate 一對多(多對一)

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

hibernate註解一對多 多對一

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