1. 程式人生 > >Hibernate中一對多配置及操作

Hibernate中一對多配置及操作

表的一對多對映配置

以客戶和聯絡人表為例子:客戶是一,聯絡人是多

1、建立實體類,客戶和聯絡人

2、讓兩個實體類之間互相表示

(1)在客戶實體類中要表示多個聯絡人

- 一個客戶有多個聯絡人

//在客戶實體類裡面表示多個聯絡人,一個客戶有多個聯絡人

//hibernate中要表示多的資料,使用set集合,不是list集合

private Set setLinkMan = new HashSet();

public Set getSetLinkMan() {

return setLinkMan;

}

public void setSetLinkMan(Set setLinkMan) {

this.setLinkMan = setLinkMan;

}

(2)在聯絡人類中要表示他所屬的客戶

- 一個聯絡人只能屬於一個客戶

//在聯絡人實體類裡面表示所屬客戶,一個聯絡人只能屬於一個客戶

private Customer customer;

public Customer getCustomer() {

return customer;

}

public void setCustomer(Customer customer) {

this.customer = customer;

}

3、配置對映檔案

(1)一個實體類對應一個對映檔案

(2)完成最基本的配置

(3)在對映檔案中,配置一對多的關係

- 在客戶對映檔案中,表示客戶的所有聯絡人

“-//Hibernate/Hibernate Mapping DTD 3.0//EN”

http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd”>

- 在聯絡人對映檔案中,表示所屬客戶

“-//Hibernate/Hibernate Mapping DTD 3.0//EN”

http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd”>

4、建立核心配置檔案,將對映配置檔案引入到核心配置檔案中

一對多級聯操作

級聯操作:

1、級聯儲存

- 新增一個客戶,為這個客戶新增聯絡人

(1)在客戶對映檔案中進行配置

– 在客戶對映檔案裡面set標籤進行配置

(2)建立客戶和聯絡人物件,只需要將聯絡人物件放到客戶物件的set集合中去,最終儲存客戶物件就可以了

@Test

public void testAdd(){

Session session = null;

Transaction tx= null;

try{

session = HibernateUtils.getSession();

tx = session.beginTransaction();

Customer customer = new Customer();

customer.setCustName(“company1”);

customer.setCustLevel(“level1”);

customer.setCustSource(“source1”);

customer.setCustPhone(“111”);

customer.setCustMobile(“135”);

LinkMan linkman = new LinkMan();

linkman.setLkm_name(“張三”);

linkman.setLkm_gender(“男”);

linkman.setLkm_phone(“1333”);

customer.getSetLinkMan().add(linkman);

session.save(customer);

tx.commit();

}

catch(Exception e){

tx.rollback();

}

finally{

session.close();

}

}

2、級聯刪除

- 刪除一個客戶,這個客戶的所有聯絡人也刪除

正常情況下,若想要刪除一個客戶的所有聯絡人,必須先把所有聯絡人刪除完才可以刪除客戶,因為客戶表和聯絡人表之間存在外來鍵約束,不能直接刪除客戶表的資料。

使用hibernate可以解決這一問題

在客戶實體類的對映檔案中的set標籤進行設定

刪除程式碼:

@Test

public void testDelete(){

Session session = null;

Transaction tx = null;

try{

session = HibernateUtils.getSession();

tx = session.beginTransaction();

//查詢customer物件

Customer customer = session.get(Customer.class, 1);

session.delete(customer);

tx.commit();

}

catch(Exception e){

tx.rollback();

}

finally{

session.close();

}

}

執行結果就是資料庫中t_customer表中id為1且在t_linkman中以id=1為外來鍵的記錄全部被刪除了

控制檯輸出sql語句:

Hibernate:

alter table t_linkman

add constraint FKjtgu0oocf35ij4fmulu123vwk

foreign key (clid)

references t_customer (cid)

Hibernate:

select

customer0_.cid as cid1_0_0_,

customer0_.custName as custName2_0_0_,

customer0_.custLevel as custLeve3_0_0_,

customer0_.custSource as custSour4_0_0_,

customer0_.custPhone as custPhon5_0_0_,

customer0_.custMobile as custMobi6_0_0_

from

t_customer customer0_

where

customer0_.cid=?

Hibernate:

select

setlinkman0_.clid as clid5_1_0_,

setlinkman0_.lkm_id as lkm_id1_1_0_,

setlinkman0_.lkm_id as lkm_id1_1_1_,

setlinkman0_.lkm_name as lkm_name2_1_1_,

setlinkman0_.lkm_gender as lkm_gend3_1_1_,

setlinkman0_.lkm_phone as lkm_phon4_1_1_,

setlinkman0_.clid as clid5_1_1_

from

t_linkman setlinkman0_

where

setlinkman0_.clid=?

Hibernate:

update

t_linkman

set

clid=null

where

clid=?

Hibernate:

delete

from

t_linkman

where

lkm_id=?

Hibernate:

delete

from

t_customer

where

cid=?

一對多修改操作

需求:更改聯絡人表中的一條資料,使其外來鍵指向客戶表中的另一條資料

//演示一對多修改

@Test

public void testUpdate(){

Session session = null;

Transaction tx = null;

try{

session = HibernateUtils.getSession();

tx = session.beginTransaction();

//查詢聯絡人和客戶物件

Customer customer = session.get(Customer.class, 2);

LinkMan linkman = session.get(LinkMan.class, 1);

//設定持久態物件值

customer.getSetLinkMan().add(linkman);

linkman.setCustomer(customer);

tx.commit();

}

catch(Exception e){

tx.rollback();

}

finally{

session.close();

}

}

通過控制檯輸出可發現一個問題:sql語句中發現對外來鍵的修改發生了兩次

Hibernate:

update

t_linkman

set

lkm_name=?,

lkm_gender=?,

lkm_phone=?,

clid=?

where

lkm_id=?

Hibernate:

update

t_linkman

set

clid=?

where

lkm_id=?

原因:在hibernate中,對外來鍵的維護是雙向的,在客戶實體類和聯絡人實體類中都需要修改外來鍵

解決方式:可以讓其中的一方放棄對外來鍵的維護,在放棄關係維護的那一方的配置檔案進行配置

在set標籤上新增inverse屬性

//inverse:預設值是false,不放棄對關係的維護

Hibernate:

update

t_linkman

set

lkm_name=?,

lkm_gender=?,

lkm_phone=?,

clid=?

where

lkm_id=?

結果對外來鍵的維護只更新了一次

瀋陽性病醫院哪家好:http://yyk.39.net/sy/zhuanke/fc844.html

瀋陽治療溼疣正規醫院:http://yyk.familydoctor.com.cn/20631/