Hibernate_day03

一、一對多/多對一:

1.關系表達:

1)表中的表達:

2)實體中的表達:

3)orm元數(shù)據(jù)中表達:
一對多:

多對一:

2.基本操作:
3.級聯(lián)操作:

結論: 簡化操作.一定要用,save-update,不建議使用delete.

4.關系維護:

舉例:

兩個表:customer表和linkman表:

Customer.java:

public class Customer {
    private Long cust_id;
    
    private String cust_name;
    private String cust_source;
    private String cust_industry;
    private String cust_level;
    private String cust_linkman;
    private String cust_phone;
    private String cust_mobile;

    //使用set集合,表達一對多關系
    private Set<LinkMan> linkMens = new HashSet<LinkMan>();
    
        //get跪另,set方法以省略
}

LinkMan.java:

public class LinkMan {
    private Long lkm_id;
    
    private Character lkm_gender;
    private String lkm_name;
    private String lkm_phone;
    private String lkm_email;
    private String lkm_qq;
    private String lkm_mobile;
    private String lkm_memo;
    private String lkm_position;
    
    //表達多對一關系
    private Customer customer ;
    
    //get,set方法以省略
}

Customer.hbm.xml:

<set name="linkMens" inverse="true" cascade="save-update"  >
    <key column="lkm_cust_id" ></key>
    <one-to-many class="LinkMan" />
</set>

LinkMan.hbm.xml:

<many-to-one name="customer" column="lkm_cust_id" class="Customer"  >
    </many-to-one>

Demo.java:

//一對多|多對一關系操作
public class Demo {
    @Test
    //保存客戶 以及客戶 下的聯(lián)系人
    public void fun1(){
        //1 獲得session
        Session session = HibernateUtils.openSession();
        //2 開啟事務
        Transaction tx = session.beginTransaction();
        //-------------------------------------------------
        //3操作
        Customer c = new Customer();
        c.setCust_name("傳智播客");
        
        LinkMan lm1 = new LinkMan();
        lm1.setLkm_name("黎活明");
        
        LinkMan lm2 = new LinkMan();
        lm2.setLkm_name("劉悅東");
        
        //表達一對多,客戶下有多個聯(lián)系人
        c.getLinkMens().add(lm1);
        c.getLinkMens().add(lm2);
        
        //表達對對對,聯(lián)系人屬于哪個客戶
        lm1.setCustomer(c);
        lm2.setCustomer(c);
        
        
        session.save(c);
//      session.save(lm1);
//      session.save(lm2);
        
        //-------------------------------------------------
        //4提交事務
        tx.commit();
        //5關閉資源
        session.close();
    }
    
    @Test
    //為客戶增加聯(lián)系人
    public void fun2(){
        //1 獲得session
        Session session = HibernateUtils.openSession();
        //2 開啟事務
        Transaction tx = session.beginTransaction();
        //-------------------------------------------------
        //3操作
        //1> 獲得要操作的客戶對象
        Customer c = session.get(Customer.class,1l);
        //2> 創(chuàng)建聯(lián)系人
        LinkMan lm1 = new LinkMan();
        lm1.setLkm_name("郝強勇");
        //3> 將聯(lián)系人添加到客戶,將客戶設置到聯(lián)系人中
        c.getLinkMens().add(lm1);
        lm1.setCustomer(c);
        //4> 執(zhí)行保存
        session.save(lm1);
        //-------------------------------------------------
        //4提交事務
        tx.commit();
        //5關閉資源
        session.close();
    }
    
    @Test
    //為客戶刪除聯(lián)系人
    public void fun3(){
        //1 獲得session
        Session session = HibernateUtils.openSession();
        //2 開啟事務
        Transaction tx = session.beginTransaction();
        //-------------------------------------------------
        //3操作
        //1> 獲得要操作的客戶對象
        Customer c = session.get(Customer.class,1l);
        //2> 獲得要移除的聯(lián)系人
        LinkMan lm = session.get(LinkMan.class, 3l);
        //3> 將聯(lián)系人從客戶集合中移除
        c.getLinkMens().remove(lm);
        lm.setCustomer(null);
        //-------------------------------------------------
        //4提交事務
        tx.commit();
        //5關閉資源
        session.close();
    }       
}

Demo2.java

//測試級聯(lián)操作
public class Demo2 {
    @Test
    //保存客戶 以及客戶 下的聯(lián)系人
    //cascade:save-update
    public void fun1(){
        //1 獲得session
        Session session = HibernateUtils.openSession();
        //2 開啟事務
        Transaction tx = session.beginTransaction();
        //-------------------------------------------------
        //3操作
        Customer c = new Customer();
        c.setCust_name("傳智播客");
        
        LinkMan lm1 = new LinkMan();
        lm1.setLkm_name("黎活明");
        
        LinkMan lm2 = new LinkMan();
        lm2.setLkm_name("劉悅東");
        
        //表達一對多,客戶下有多個聯(lián)系人
        c.getLinkMens().add(lm1);
        c.getLinkMens().add(lm2);
        
        //表達對對對,聯(lián)系人屬于哪個客戶
        lm1.setCustomer(c);
        lm2.setCustomer(c);
        
        
        session.save(c);
//      session.save(lm1);
//      session.save(lm2);
        
        //-------------------------------------------------
        //4提交事務
        tx.commit();
        //5關閉資源
        session.close();
    }
    
    @Test
    //測試刪除客戶時,級聯(lián)刪除客戶下的聯(lián)系人
    //cascade:delete
    public void fun2(){
        //1 獲得session
        Session session = HibernateUtils.openSession();
        //2 開啟事務
        Transaction tx = session.beginTransaction();
        //-------------------------------------------------
        //3操作
        //1> 獲得要操作的客戶對象
        Customer c = session.get(Customer.class,1l);
        //2>調用delete刪除客戶
        session.delete(c);
        //-------------------------------------------------
        //4提交事務
        tx.commit();
        //5關閉資源
        session.close();
    }
    
    @Test
    //保存聯(lián)系人以及聯(lián)系人對應的客戶
    //cascade:save-update
    public void fun3(){
        //1 獲得session
        Session session = HibernateUtils.openSession();
        //2 開啟事務
        Transaction tx = session.beginTransaction();
        //-------------------------------------------------
        //3操作
        Customer c = new Customer();
        c.setCust_name("北大青鳥");
        
        LinkMan lm1 = new LinkMan();
        lm1.setLkm_name("劉總");
        
        //表達一對多,客戶下有多個聯(lián)系人
        c.getLinkMens().add(lm1);
        
        //表達對對對,聯(lián)系人屬于哪個客戶
        lm1.setCustomer(c);
        
        
        session.save(lm1);
        
        //-------------------------------------------------
        //4提交事務
        tx.commit();
        //5關閉資源
        session.close();
    }   
}

Demo3.java:

//操作進階--關系維護屬性
public class Demo3 {
    @Test
    //保存客戶 以及客戶 下的聯(lián)系人
    public void fun1(){
        //1 獲得session
        Session session = HibernateUtils.openSession();
        //2 開啟事務
        Transaction tx = session.beginTransaction();
        //-------------------------------------------------
        //3操作
        Customer c = new Customer();
        c.setCust_name("傳智播客");
        
        LinkMan lm1 = new LinkMan();
        lm1.setLkm_name("黎活明");
        
        LinkMan lm2 = new LinkMan();
        lm2.setLkm_name("劉悅東");
        
        //表達一對多,客戶下有多個聯(lián)系人. 
        // 如果客戶放棄維護與聯(lián)系人的關系. 維護關系的代碼可以省略
        //c.getLinkMens().add(lm1);
        //c.getLinkMens().add(lm2);
        
        //表達對對對,聯(lián)系人屬于哪個客戶
        lm1.setCustomer(c);
        lm2.setCustomer(c);
        
        
        session.save(c);
        session.save(lm1);
        session.save(lm2);
        
        //-------------------------------------------------
        //4提交事務
        tx.commit();
        //5關閉資源
        session.close();
    }
    
    @Test
    //刪除客戶
    public void fun2(){
        //1 獲得session
        Session session = HibernateUtils.openSession();
        //2 開啟事務
        Transaction tx = session.beginTransaction();
        //-------------------------------------------------
        //3操作
        Customer customer = session.get(Customer.class, 1l);
        
        session.delete(customer);
        //-------------------------------------------------
        //4提交事務
        tx.commit();
        //5關閉資源
        session.close();
    }   
}

二、多對多:

1.關系表達;

1)表中:

2)實體中:

3)orm元數(shù)據(jù)中:

2.操作:
3.inverse屬性:
4.級聯(lián)屬性:

舉例:

兩個表:User表和Role表

User.java:

public class User {
    private Long user_id;
    private String user_code;
    private String user_name;
    private String user_password;
    private Character user_state;
    
    //表達多對多
    private Set<Role> roles = new HashSet<Role>();
}

Role.java:

public class Role {
    private Long role_id;
    private String role_name;
    private String role_memo;
    
    //表達多對多
    private Set<User> users = new HashSet<User>();
}

User.hbm.xml:

<set name="roles" table="sys_user_role" cascade="save-update" >
    <key column="user_id" ></key>
    <many-to-many class="Role" column="role_id" ></many-to-many>
</set>

Role.hbm.xml:

<set name="users" table="sys_user_role" inverse="true" >
    <key column="role_id" ></key>
    <many-to-many class="User" column="user_id" ></many-to-many>
</set>

Demo.java

//多對多關系操作
public class Demo {
    @Test
    //保存員工以及角色
    public void fun1(){
        //1 獲得session
        Session session = HibernateUtils.openSession();
        //2 開啟事務
        Transaction tx = session.beginTransaction();
        //-------------------------------------------------
        //3操作
        //1> 創(chuàng)建兩個 User
        User u1 = new User();
        u1.setUser_name("郝強勇");
        
        User u2 = new User();
        u2.setUser_name("金家德");
        
        //2> 創(chuàng)建兩個 Role
        Role r1 = new Role();
        r1.setRole_name("保潔");
        
        Role r2 = new Role();
        r2.setRole_name("保安");
        //3> 用戶表達關系
        u1.getRoles().add(r1);
        u1.getRoles().add(r2);
        
        u2.getRoles().add(r1);
        u2.getRoles().add(r2);
        
        //4> 角色表達關系
        r1.getUsers().add(u1);
        r1.getUsers().add(u2);
        
        r2.getUsers().add(u1);
        r2.getUsers().add(u2);
        
        //5> 調用Save方法一次保存
        session.save(u1);
        session.save(u2);
        session.save(r1);
        session.save(r2);
        //-------------------------------------------------
        //4提交事務
        tx.commit();
        //5關閉資源
        session.close();
    }
    
    @Test
    //為郝強勇新增一個角色
    public void fun3(){
        //1 獲得session
        Session session = HibernateUtils.openSession();
        //2 開啟事務
        Transaction tx = session.beginTransaction();
        //-------------------------------------------------
        //3操作
        //1> 獲得郝強勇用戶
        User user = session.get(User.class, 1l);
        //2> 創(chuàng)建公關角色
        Role r = new Role();
        r.setRole_name("男公關");
        //3> 將角色添加到用戶中
        user.getRoles().add(r);
        //4> 將角色轉換為持久化
        //session.save(r);
        //-------------------------------------------------
        //4提交事務
        tx.commit();
        //5關閉資源
        session.close();
    }
    
    @Test
    //為郝強勇解除一個角色
    public void fun4(){
        //1 獲得session
        Session session = HibernateUtils.openSession();
        //2 開啟事務
        Transaction tx = session.beginTransaction();
        //-------------------------------------------------
        //3操作
        //1> 獲得郝強勇用戶
        User user = session.get(User.class, 1l);
        //2> 獲得要操作的角色對象(保潔,保安)
        Role r1 = session.get(Role.class, 1l);
        Role r2 = session.get(Role.class, 2l);
        //3> 將角色從用戶的角色集合中移除
        user.getRoles().remove(r1);
        user.getRoles().remove(r2);
        
        //-------------------------------------------------
        //4提交事務
        tx.commit();
        //5關閉資源
        session.close();
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末苛茂,一起剝皮案震驚了整個濱河市筛谚,隨后出現(xiàn)的幾起案子捻脖,更是在濱河造成了極大的恐慌锐峭,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件可婶,死亡現(xiàn)場離奇詭異沿癞,居然都是意外死亡,警方通過查閱死者的電腦和手機矛渴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門椎扬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事蚕涤【Ц” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵钻趋,是天一觀的道長。 經常有香客問我剂习,道長蛮位,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任鳞绕,我火速辦了婚禮失仁,結果婚禮上,老公的妹妹穿的比我還像新娘们何。我一直安慰自己萄焦,他們只是感情好,可當我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布冤竹。 她就那樣靜靜地躺著拂封,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鹦蠕。 梳的紋絲不亂的頭發(fā)上冒签,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天,我揣著相機與錄音钟病,去河邊找鬼萧恕。 笑死,一個胖子當著我的面吹牛肠阱,可吹牛的內容都是我干的票唆。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼屹徘,長吁一口氣:“原來是場噩夢啊……” “哼走趋!你這毒婦竟也來了?” 一聲冷哼從身側響起噪伊,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤吆视,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后酥宴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啦吧,經...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年拙寡,在試婚紗的時候發(fā)現(xiàn)自己被綠了授滓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖般堆,靈堂內的尸體忽然破棺而出在孝,到底是詐尸還是另有隱情,我是刑警寧澤淮摔,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布私沮,位于F島的核電站,受9級特大地震影響和橙,放射性物質發(fā)生泄漏仔燕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一魔招、第九天 我趴在偏房一處隱蔽的房頂上張望晰搀。 院中可真熱鬧,春花似錦办斑、人聲如沸外恕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鳞疲。三九已至,卻和暖如春蠕蚜,著一層夾襖步出監(jiān)牢的瞬間建丧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工波势, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留翎朱,地道東北人。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓尺铣,卻偏偏與公主長得像拴曲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子凛忿,可洞房花燭夜當晚...
    茶點故事閱讀 45,922評論 2 361