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/