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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

hibernate_day03_一对多相关操作

發布時間:2024/9/30 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hibernate_day03_一对多相关操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

hibernate_day03_MySQL數據庫-表與表之間的多對多關系-實例

hibernate_day03_一對多相關操作

【1】一對多關系只保存一邊是否可以 :不可以,會報錯(瞬時對象異常)。

【2】一對多的級聯操作 :

  • 什么叫做級聯
  • 級聯指的是,操作一個對象的時候,是否會同時操作其關聯的對象。
  • 級聯是有方向性
  • 操作一的一方的時候,是否操作到多的一方
  • 操作多的一方的時候,是否操作到一的一方
  • 【3】級聯保存或更新 :

    【4】測試對象的導航 :

    【5】級聯刪除 :

    【6】一對多設置了雙向關聯產生多余的SQL語句 :

    【7】區分cascade和inverse :

    (1)HibernateDemo1.java :

    package com.itheima.hibernate.demo1;import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test;import com.itheima.hibernate.domain.Customer; import com.itheima.hibernate.domain.LinkMan; import com.itheima.hibernate.utils.HibernateUtils;/*** * * 一對多的測試類* */ public class HibernateDemo1 {// @Test // // 保存2個客戶 和 3個聯系人 并且建立好關系 // public void demo1() { // Session session = HibernateUtils.getCurrentSession(); // Transaction tx = session.beginTransaction(); // // // 創建兩個客戶 // Customer customer1 = new Customer(); // customer1.setCust_name("wd"); // Customer customer2 = new Customer(); // customer2.setCust_name("zh"); // // // 創建三個聯系人 // LinkMan linkMan1 = new LinkMan(); // linkMan1.setLkm_name("fengjie"); // LinkMan linkMan2 = new LinkMan(); // linkMan2.setLkm_name("ruhua"); // LinkMan linkMan3 = new LinkMan(); // linkMan3.setLkm_name("wangcai"); // // // 設置關系: 【一個客戶 對應 多個聯系人。】 // linkMan1.setCustomer(customer1); // linkMan2.setCustomer(customer1); // linkMan3.setCustomer(customer2); // customer1.getLinkMans().add(linkMan1); // customer1.getLinkMans().add(linkMan2); // customer2.getLinkMans().add(linkMan3); // // // 保存數據: // session.save(linkMan1); // session.save(linkMan2); // session.save(linkMan3); // session.save(customer1); // session.save(customer2); // // tx.commit(); // } // // @Test // // 一對多關系只保存一邊[客戶 or 聯系人]是否可以:不可以[報錯] // public void demo2() { // Session session = HibernateUtils.getCurrentSession(); // Transaction tx = session.beginTransaction(); // // Customer customer = new Customer(); //瞬時 // customer.setCust_name("zhaohong"); // // LinkMan linkMan = new LinkMan(); // linkMan.setLkm_name("ruhua"); // // customer.getLinkMans().add(linkMan);// 客戶關聯聯系人 // linkMan.setCustomer(customer); // 聯系人關聯客戶 // // // 只保存一邊是否可以: // // 不可以,報一個瞬時對象異常:持久態對象關聯了一個瞬時態對象。 // //session.save(customer); // session.save(linkMan); // // //通過級聯操作,可解決 異常 // // tx.commit(); // } // // @Test // /** // * 級聯保存或更新操作: * 保存客戶級聯聯系人,操作的主體是客戶對象,需要在Customer.hbm.xml中進行配置 * // * <set name="linkMans" cascade="save-update"> // * 【session.save(customer); 保存誰,配置誰 】 // */ // public void demo3() { // Session session = HibernateUtils.getCurrentSession(); // Transaction tx = session.beginTransaction(); // // Customer customer = new Customer(); // customer.setCust_name("zhaohong"); // // LinkMan linkMan = new LinkMan(); // linkMan.setLkm_name("ruhua"); // // customer.getLinkMans().add(linkMan); // linkMan.setCustomer(customer); // // session.save(customer); // // tx.commit(); // } // // @Test // /** // * 級聯保存或更新操作: * 保存聯系人級聯客戶,操作的主體是聯系人對象,需要在LinkMan.hbm.xml中進行配置 * // * <many-to-one name="customer" cascade="save-update" class= // * "com.itheima.hibernate.domain.Customer" column="lkm_cust_id"/> // */ // public void demo4() { // Session session = HibernateUtils.getCurrentSession(); // Transaction tx = session.beginTransaction(); // // Customer customer = new Customer(); // customer.setCust_name("libing"); // // LinkMan linkMan = new LinkMan(); // linkMan.setLkm_name("fengjie"); // // customer.getLinkMans().add(linkMan); // linkMan.setCustomer(customer); // // session.save(linkMan); // // tx.commit(); // }// @Test // /** // * 測試對象的導航 // * * 前提:一對多的雙方都設置cascade="save-update" // */ // public void demo5() { // Session session = HibernateUtils.getCurrentSession(); // Transaction tx = session.beginTransaction(); // // Customer customer = new Customer(); // customer.setCust_name("libing"); // // LinkMan linkMan1 = new LinkMan(); // linkMan1.setLkm_name("fengjie"); // LinkMan linkMan2 = new LinkMan(); // linkMan2.setLkm_name("ruhua"); // LinkMan linkMan3 = new LinkMan(); // linkMan3.setLkm_name("furong"); // // // 鳳姐找李冰,李冰找如花、芙蓉 // linkMan1.setCustomer(customer); // 1號聯系人關聯客戶 // customer.getLinkMans().add(linkMan2); // 客戶關聯2號聯系人 // customer.getLinkMans().add(linkMan3); // 客戶關聯3號聯系人 // // // 雙方都設置了cascade // session.save(linkMan1); // 發送幾條insert語句 4條 // // [session.save(linkMan1);] linkMan1、[linkMan1.setCustomer(customer);] customer、 // // [customer.getLinkMans().add(linkMan2);]linkMan2、[customer.getLinkMans().add(linkMan3);]linkMan3 所以,4條語句 // // //session.save(customer); // 發送幾條insert語句 3條 // // customer.getLinkMans().add(linkMan2); \ customer.getLinkMans().add(linkMan3); // // //session.save(linkMan2); // 發送幾條insert語句 1條 // // tx.commit(); // } // // @Test // /** // * 級聯刪除: // * * 刪除客戶級聯刪除聯系人,刪除的主體是客戶,需要在Customer.hbm.xml中配置 // * * <set name="linkMans" cascade="delete"> // * * cascade="save-update,delete" :同時具有2個功能。 // */ // public void demo6(){ // Session session = HibernateUtils.getCurrentSession(); // Transaction tx = session.beginTransaction(); // // // 沒有設置級聯刪除,默認情況:修改了聯系人的外鍵,刪除客戶 // /*Customer customer = session.get(Customer.class, 1l); // session.delete(customer);*/ // // // 刪除客戶,同時刪除聯系人 // Customer customer = session.get(Customer.class, 1l); // session.delete(customer); // // tx.commit(); // } // // @Test // /** // * 級聯刪除: // * * 刪除聯系人級聯刪除客戶,刪除的主體是聯系人,需要在LinkMan.hbm.xml中配置 // * * <many-to-one name="customer" cascade="delete"> // */ // public void demo7(){ // Session session = HibernateUtils.getCurrentSession(); // Transaction tx = session.beginTransaction(); // // // 刪除客戶,同時刪除聯系人 // /** // * 先查詢,再刪除。 // * 不能直接創建對象去刪除。創建對象,集合為空,無法刪除。 // * get()后,查詢客戶關聯的集合,有數據,可刪除。 // */ // LinkMan linkMan = session.get(LinkMan.class, 3l); // session.delete(linkMan); // // tx.commit(); // }// @Test // /** // * 將2號聯系人原來歸1號客戶,現在改為2號客戶 // */ // public void demo8(){ // Session session = HibernateUtils.getCurrentSession(); // Transaction tx = session.beginTransaction(); // // // 查詢2號聯系人 // LinkMan linkMan = session.get(LinkMan.class, 2l);//持久態對象 // // 查詢2號客戶 // Customer customer = session.get(Customer.class, 2l);//持久態對象 // // 雙向的關聯 // linkMan.setCustomer(customer); // customer.getLinkMans().add(linkMan); // // //持久態對象發生變化,自動更新數據庫 // // tx.commit(); // }@Test/*** 區分cascade和inverse的區別*/public void demo9(){Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();Customer customer = new Customer();customer.setCust_name("libing");LinkMan linkMan = new LinkMan();linkMan.setLkm_name("fengjie");customer.getLinkMans().add(linkMan);// 條件在Customer.hbm.xml上的set中配置了cascade="save-update" inverse="true"/*** Customer.hbm.xml : <set name="linkMans" cascade="save-update" inverse="true">* LinkMan.hbm.xml : <many-to-one name="customer" class="com.itheima.hibernate.domain.Customer" column="lkm_cust_id"/>*/session.save(customer); // 客戶會插入到數據庫,聯系人也會插入到數據庫,但是外鍵為null/* cascade : 控制對象的關聯對象。操作關聯對象【客戶進入數據庫,客戶關聯的對象也會進入數據庫】* inverse="true" : 控制一的一方能不能維護外鍵。true放棄外鍵*/tx.commit();} }

    (2)Customer.hbm.xml :

    <?xml version="1.0" encoding="UTF-8"?><!-- 引入約束-配置約束 --> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping><!-- name是Customer類的全路徑 --><class name="com.itheima.hibernate.domain.Customer" table="cst_customer"><!-- 建立OID與主鍵映射 --><id name="cust_id" column="cust_id"><!-- 主鍵生成策略 --><generator class="native"/></id><!-- 建立普通屬性與數據庫表字段映射 --><property name="cust_name" column="cust_name" /><property name="cust_source" column="cust_source"/><property name="cust_industry" column="cust_industry"/><property name="cust_level" column="cust_level"/><property name="cust_phone" column="cust_phone"/><property name="cust_mobile" column="cust_mobile"/><!-- 配置一對多的映射:放置的多的一方的集合 --><!-- set標簽 :* name :多的一方的對象集合的屬性名稱。[ Customer.java類 ]* cascade:級聯【save-update 保存或更新】* inverse:放棄外鍵維護權true。 cascade="save-update,delete" 同時具有2個功能。--><set name="linkMans" cascade="save-update" inverse="true"><!-- key標簽 : 【column :多的一方的外鍵的名稱。】--><key column="lkm_cust_id"/><!-- one-to-many標簽 : 【class : 多的一方的類的全路徑。】--><one-to-many class="com.itheima.hibernate.domain.LinkMan"/></set></class> </hibernate-mapping>

    (3)LinkMan.hbm.xml :

    <?xml version="1.0" encoding="UTF-8"?><!-- 引入約束-配置約束 --> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping><!-- name是Customer類的全路徑 --><class name="com.itheima.hibernate.domain.LinkMan" table="cst_linkman"><!-- 建立OID與主鍵映射 --><id name="lkm_id" column="lkm_id"><!-- 主鍵生成策略 --><generator class="native"/></id><!-- 建立普通屬性與表字段映射 ; name與column相等,column可省略--><property name="lkm_name"/><property name="lkm_gender"/><property name="lkm_phone"/><property name="lkm_mobile"/><property name="lkm_email"/><property name="lkm_qq"/><property name="lkm_position"/><property name="lkm_memo"/><!-- 【聯系人:多】 配置多對一的關系:放置的是一的一方的對象 --><!-- 多對一many-to-one標簽* name : 一的一方的對象的屬性名稱。【LinkMan.java類】* class : 一的一方的類的全路徑。* column : 在多的一方的表的外鍵的名稱。 --><many-to-one name="customer" class="com.itheima.hibernate.domain.Customer" column="lkm_cust_id"/></class> </hibernate-mapping>

    博主QQ : 386335886?

    代碼來源 :bilibili網站(https://www.bilibili.com/video/av33127718?p=31)

    夫心起于善,善雖未為,而吉神已隨之。其有曾行惡事,后自改悔,諸惡莫作,眾善奉行,久久必獲吉慶,所謂轉禍為福也。
    故吉人語善、視善、行善,一日有三善,三年天必降之福。兇人語惡、視惡、行惡,一日有三惡,三年天必降之禍。胡不勉而行之?

    ?

    總結

    以上是生活随笔為你收集整理的hibernate_day03_一对多相关操作的全部內容,希望文章能夠幫你解決所遇到的問題。

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