Hibernate學習筆記(三)
Hibernate學習筆記(一對多、多對多操作)
hibernate一對多對映配置
1. 首先建立兩個實體類,我便以客戶與聯絡人為例子說明
2. 兩個實體類之間要相互的表示
(1) 在客戶實體類裡面有多個聯絡人
//hibernate 中要求使用set集合來儲存類似這種情況
private Set<LinkMan> setLinkMan = new HashSet<LinkMan>();
(2) 一個聯絡人屬於一個客戶
//表示聯絡人所屬於的客戶
private Customer customer;
3. 對映檔案裡面配置一對多的關係
(1) 客戶對映檔案中表示所有聯絡人,使用set標籤表示多個聯絡人,其中name屬性填寫的是一對多關係中多的一方集合的名字,即填寫客戶實體類裡面客戶set集合的名稱,而裡面的key標籤是指名資料庫表的外來鍵名稱,\標籤是指明兩個實體類的關係為一對多、class屬性填寫的是多的一方的實體類路徑
<!-- 在客戶的對映檔案中表示所有聯絡人 -->
<set name="setLinkMan">
<!-- 一對多建表,有外來鍵
Hibernate雙向維護外來鍵,兩方都要配置
column屬性值是外來鍵名稱
-->
<key column="clid"></key>
<!-- 客戶所有的聯絡人,class裡面寫聯絡人實體類全路徑 -->
<one-to-many class="entity.LinkMan"/>
</set>
(2) 在聯絡人實體類裡面表示所屬的客戶,同樣,\是指明兩個實體類的關係,其中class指明一的那一方實體類的全路徑,而column是需要填寫外來鍵的名稱,也就是之前在客戶實體類配置檔案裡填寫的外來鍵
<!-- 聯絡人所屬的客戶 -->
<many-to-one name="customer" class="entity.Customer" column="clid"></many-to-one>
4. 在核心配置檔案中將兩個對映檔案引入
hibernate一對多級聯操作
1. 級聯儲存(例如:新增一個客戶,為這個客戶新增聯絡人)
(1) 複雜做法,需要在兩個實體類之間相互表示關係,對兩張表同時更新
//建立客戶的物件
Customer customer = new Customer();
customer.setCustName("it");
customer.setCustLevel("vip");
customer.setCustSource("net");
customer.setCustPhone("110");
customer.setCustMobile("999");
//建立聯絡人物件
LinkMan linkMan = new LinkMan();
linkMan.setLkm_name("luck");
linkMan.setLkm_gender("男");
linkMan.setLkm_phone("121");
//建立兩個實體類之間的關係
customer.getSetLinkMan().add(linkMan);
linkMan.setCustomer(customer);
//向資料庫中儲存
session.save(linkMan);
session.save(customer);
(2) 簡化做法,首先需要在多的一方的對映檔案中配置,在其set標籤里加一個屬性,cascade屬性,它的值有save-update、delete等,分別表示級聯更新、級聯刪除,多個屬性之間用逗號隔開如:“save-update,delete”。這時候只需要將聯絡人加入到客戶裡面、更新客戶即可
<set name="setLinkMan" cascade="save-update">
customer.getSetLinkMan().add(linkMan);
session.save(customer);
2. 級聯刪除(例如:刪除一個客戶,這個客戶裡面的所有聯絡人也要刪除)
(1) 需要在配置檔案裡面配置,參照上文
<set name="setLinkMan" cascade="save-update,delete">
(2) 在程式碼中就可以直接刪除客戶了
Customer customer = session.get(Customer.class, 1);
session.delete(customer);`
hibernate中一對多的修改操作
1. 直接修改會產生一個問題,需要配置一個屬性inverse=”true”,因為Hibernate對外來鍵是雙向維護,會對外來鍵進行兩次更新,降低了效率,因此將inverter屬性設定為true可以讓一的一方放棄維護。
Customer baidu = session.get(Customer.class, 4);
LinkMan linkMan = session.get(LinkMan.class, 3);
baidu.getSetLinkMan().add(linkMan);
linkMan.setCustomer(baidu);
hibernate的多對多操作(例:使用者和角色)
1. 多對多的對映配置
(1) 建立實體類,使用者和角色
User
private Integer user_id;
private String user_Name;
private String user_password;
Role
private Integer role_id;
private String role_name;
private String role_memo;
(2) 一個使用者表示多個角色
private Set<Role> setRole = new HashSet<Role>();
(3) 一個角色有多個使用者
private Set<User> setUser = new HashSet<User>();
(4) 配置多對多關係,與一對多關係中多的一方配置相似
角色的配置檔案
<set name="setUser" table="user_role" cascade="save-update">
<!-- 當前對映檔案,在第三張表中的外來鍵名稱 -->
<key column="roleid"></key>
<!--
class屬性:角色實體類全路徑
column屬性:角色在第三張表的外來鍵名稱
-->
<many-to-many class="entity.User" column="userid"></many-to-many>
</set>
使用者的配置檔案
<!-- 在使用者裡面表示所有的角色
name屬性:角色set集合的名稱
table屬性:第三張表的名稱
-->
<set name="setRole" table="user_role" cascade="save-update">
<!-- 當前對映檔案,在第三張表中的外來鍵名稱 -->
<key column="userid"></key>
<!--
class屬性:角色實體類全路徑
column屬性:角色在第三張表的外來鍵名稱
-->
<many-to-many class="entity.Role" column="roleid"></many-to-many>
</set>
(5) 在核心配置檔案匯入對映檔案
2. 多對多的級聯儲存
(1) 根據使用者儲存角色,在使用者對映檔案裡面講set標籤裡的cascade屬性設定為save-update
//建立使用者
User user1 = new User();
User user2 = new User();
//建立角色
Role r1 = new Role();
Role r2 = new Role();
Role r3 = new Role();
//user1有r1\r2的角色
user1.getSetRole().add(r1);
user1.getSetRole().add(r2);
//user2有r2\r3的角色
user2.getSetRole().add(r2);
user2.getSetRole().add(r3);
//儲存使用者
session.save(user1);
session.save(user2);
3. 多對多的級聯刪除一般不會去用,因為會導致使用者與角色表的資料刪除,因此不需要級聯刪除,只需要去維護第三張關係表就可以了
4. 維護第三張表
(1) 讓使用者有某些角色,直接將使用者和角色查出來,在使用者的角色集合中新增即可
User user = session.get(User.class, 3);
Role role = session.get(Role.class,1);
user.getSetRole().add(role);
(2) 讓使用者沒有某些角色,也是直接將使用者和角色查出來,在使用者的角色集合中刪除即可
User user = session.get(User.class, 3);
Role role = session.get(Role.class,1);
user.getSetRole().remove(role);