Hibernate学习笔记③
數據庫關系
多對多:通過第三張表來建立關系
第三張表至少包含兩個字段作為外鍵且字段是其他兩張表的主鍵
Hibernate一對多的操作
(1)一對多映射配置
??? 步驟:
配置文件【一對多中一的一方】
<?xml version="1.0" encoding="UTF-8"?> <!-- 引入XML dtd 約束 --> <!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping><class name="tech.youngs.entity.Client" table="t_client"><id name="cid" column="cid"><generator class="native"></generator></id><property name="cName" column="cName"></property><property name="cLevel" column="cLevel"></property><!-- 使用set標簽表示所有的多【聯系人】 @param name 在實體類中表示多的set集合的屬性名--><set name="belongContecter"><!-- 一對多建表 要有外鍵 hibernate規定雙方都要配置外鍵 --><!-- @param column 外鍵的名稱 --><key column="fk_cl"></key><!-- 使用one-to-many表示一對多關系中 一的那一方 --><!-- @param class 一對多的多的實體類的全路徑 --><one-to-many class="tech.youngs.entity.Contacter"/></set></class> </hibernate-mapping>配置文件【一對多中多的一方】
?
<?xml version="1.0" encoding="UTF-8"?> <!-- 引入XML dtd 約束 --> <!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping><class name="tech.youngs.entity.Contacter" table="t_contacter"><id name="lid" column="lid"><generator class="native"></generator></id><property name="lName" column="lName"></property><property name="lPhone" column="lPhone"></property><!-- 表示一對多 多所屬的一 --><!-- @param name 在實體類中表示所屬的一的實體類的屬性名 --><!-- @param class 一對多 多所屬的一的實體類的全路徑 --><!-- @param column 外鍵的名稱 與一的配置文件中定義的相同 --><many-to-one name="lClient" class="tech.youngs.entity.Client" column="fk_cl"></many-to-one></class> </hibernate-mapping>(2)一對多級聯操作
包括級聯保存和級聯刪除
- 級聯保存:創建一個客戶及多個聯系人
- 級聯刪除:刪除客戶以及其聯系人,傳統的做法需要刪除所有聯系人后才能刪除客戶
級聯保存第一種方式:
//第一步 創建客戶和聯系人對象Client client = new Client();Contacter contacter = new Contacter();client.setcName("Baidu");client.setcLevel("vip");contacter.setlName("Lucy");contacter.setlPhone("15191082682");//第二步 體現出兩個實體類的一對多關系//把聯系人對象放到客戶的Set集合里面去 client.getBelongContecter().add(contacter);//把客戶對象方法放到聯系人中去 contacter.setlClient(client);//第三步 保存到數據庫中 session.save(client);session.save(contacter);級聯保存第二種方法:
第一步,在客戶實體類的映射配置代碼中的<set>中添加cascade屬性 cascade="save-update"
<set name="belongContecter" cascade="save-update"><!-- 一對多建表 要有外鍵 hibernate規定雙方都要配置外鍵 --><!-- @param column 外鍵的名稱 --><key column="fk_cl"></key><!-- 使用one-to-many表示一對多關系中 一的那一方 --><!-- @param class 一對多的多的實體類的全路徑 --><one-to-many class="tech.youngs.entity.Contacter"/></set>第二步 只需要將聯系人放到客戶里面就可以了,最終只保存客戶就行了。
//第二步 把聯系人對象放到客戶的Set集合里面去 client.getBelongContecter().add(contacter);//第三步 保存到數據庫中session.save(client);級聯刪除操作
第一步:在一對多的一的映射配置文件中的<set>標簽的cascade屬性設置為delete即可
???????? cascade設置多屬性,屬性和屬性之間用逗號隔開
第二步:直接刪除即可
Client client = session.get(Client.class, 1); session.delete(client);Hibernate級聯刪除的SQL執行過程
Hibernate: updatet_contacter setfk_cl=null wherefk_cl=? Hibernate: delete fromt_contacter wherelid=? Hibernate: delete fromt_client wherecid=??一對多的修改
?? 業務需求 將A公司的聯系人lucy調整到B公司的聯系人
//根據id查出調出員工和調入部門Client client = session.get(Client.class, 1);Contacter contacter = session.get(Contacter.class, 2);//持久態實體類 直接修改客戶就行了//持久態可以自動更新數據庫client.getBelongContecter().add(contacter);contacter.setlClient(client);注意,由于在一對多的映射文件中,外鍵由雙方維護,在修改的時候會重復修改外鍵。
解決方案:在一對多的關系里,可以讓一的一方放棄對外鍵的維護。
實現方法:在放棄外鍵維護的映射文件中進行配置,在set標簽上使用inverse屬性,設置為true,放棄關系維護。
<set name="belongContecter" cascade="save-update,delete" inverse="true">?
Hibernate多對多的操作
多對多映射配置(重要,常用,復雜)
?
<?xml version="1.0" encoding="UTF-8"?> <!-- 引入XML dtd 約束 --> <!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping><class name="tech.youngs.entity.User" table="t_user"><id name="uid" column="uid"><generator class="native"></generator></id><property name="username" column="username"></property><!-- 使用set標簽表示所有的多【聯系人】 @param name 在實體類中表示多的set集合的屬性名@param table 第三張表的名稱--><set name="roleSet" table="user_role" cascade="save-update"><!-- @param column 配置的是當前的映射文件在第三張表中的外鍵的名稱 --><key column="user_id"></key><!-- 使用many-to-many表示多對多關系 --><!-- @param class 一對多的多的實體類的全路徑 --><!-- @param colunmn 表示的是多對多另外的多的第三張表的外鍵多的名稱 --><many-to-many class="tech.youngs.entity.Role" column="role_id"></many-to-many></set></class> </hibernate-mapping>?
<?xml version="1.0" encoding="UTF-8"?> <!-- 引入XML dtd 約束 --> <!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping><class name="tech.youngs.entity.Role" table="t_role"><id name="rid" column="rid"><generator class="native"></generator></id><property name="roleName" column="roleName"></property><!-- 使用set標簽表示所有的多【聯系人】 @param name 在實體類中表示多的set集合的屬性名--><set name="userSet" table="user_role"><!-- @param column 第三張表中這個實體類的外鍵的名稱 --><key column="role_id"></key><!-- @param class 多對多的另一個多的實體類的全路徑 --><many-to-many class="tech.youngs.entity.User" column="user_id"></many-to-many></set></class> </hibernate-mapping>同樣的,兩個實體類需要建立關系,通過Set集合來建立。
多對多的增加與一對多幾乎相同。
多對多中一般不使用級聯刪除:
????? 因為級聯刪除會將刪除條目的外鍵的條目一并刪除,在實際開發中如果要刪除某個用戶的某個角色我們并不希望其將角色也刪除,只需要將該用戶的該角色去掉即可。如果級聯刪除的話會將角色一并刪除,其他擁有此角色的用戶一并被刪除,這是不現實的。
?
通過維護第三張表來表更多對多關系(重要,常用)
讓某個角色擁有某個角色:在第三張表中增加uid和rid的對應關系即可,即增加User中role set的對象
實現代碼:
?
User user = session.get(User.class, 1);Role role = session.get(Role.class, 2);user.getRoleSet().add(role);?
同理,讓某個角色失去某個角色,移除User中role set中的角色即可
實現代碼:
User user = session.get(User.class, 1);Role role = session.get(Role.class, 2);user.getRoleSet().remove(role);?
轉載于:https://www.cnblogs.com/youngs/p/6550160.html
總結
以上是生活随笔為你收集整理的Hibernate学习笔记③的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Bluetooth LE for iOS
- 下一篇: Web GIS多种方式发布动态地图服务及