日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hibernate学习笔记③

發布時間:2023/12/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hibernate学习笔记③ 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數據庫關系

多對多:通過第三張表來建立關系

第三張表至少包含兩個字段作為外鍵且字段是其他兩張表的主鍵

Hibernate一對多的操作

(1)一對多映射配置

??? 步驟:

  • 首先創建兩個存在一對多關系的實體類
  • 兩個實體類需要建立一對多的關系:在多的一方使用一的一方的對象表示所屬一的類;在一的一方使用Set集合表示全部屬于一的多的實體類;Hibernate中規定必須使用set集合來表示屬于一的多的實體類,Set的特點是:無順序、不重復;
  • 建立兩個實體類的映射表【配置文件】
  • public class Contacter {private Integer lid;private String lName;private String lPhone;private Client lClient; //在多的一方使用一的一方的實體類建立關系public class Client {private Integer cid;private String cName;private String cLevel;//Hibernate要求在多的里面使用set表示,不使用list//Set是無序的,不可重復的集合private Set<Contacter> belongContecter = new HashSet<Contacter>(); //在多的一方使用Set集合包含屬于一的一方的多的實體類,建立關系

    配置文件【一對多中一的一方】

    <?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学习笔记③的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。