Hibernate 多對多操作

一 多對多映射配置
1 創(chuàng)建實(shí)體類,用戶和角色
UserDemo.java

package entity;

import java.util.HashSet;
import java.util.Set;

public class UserDemo {
    private Integer user_id;
    private String user_name;
    private String user_password;
    //一個用戶可以有多個角色
    private Set<Role> setRole = new HashSet<Role>();

    public Set<Role> getSetRole() {
        return setRole;
    }

    public void setSetRole(Set<Role> setRole) {
        this.setRole = setRole;
    }

    public Integer getUser_id() {
        return user_id;
    }

    public void setUser_id(Integer user_id) {
        this.user_id = user_id;
    }

    public String getUser_name() {
        return user_name;
    }

    public void setUser_name(String user_name) {
        this.user_name = user_name;
    }

    public String getUser_password() {
        return user_password;
    }

    public void setUser_password(String user_password) {
        this.user_password = user_password;
    }
}

Role.java

package entity;

import java.util.HashSet;
import java.util.Set;

public class Role {
    private Integer role_id;
    private String role_name;
    private String role_memo;
    //一個角色中有多個用戶
    private Set<UserDemo> setUser = new HashSet<UserDemo>();

    public Set<UserDemo> getSetUser() {
        return setUser;
    }

    public void setSetUser(Set<UserDemo> setUser) {
        this.setUser = setUser;
    }

    public Integer getRole_id() {
        return role_id;
    }

    public void setRole_id(Integer role_id) {
        this.role_id = role_id;
    }

    public String getRole_name() {
        return role_name;
    }

    public void setRole_name(String role_name) {
        this.role_name = role_name;
    }

    public String getRole_memo() {
        return role_memo;
    }

    public void setRole_memo(String role_memo) {
        this.role_memo = role_memo;
    }
}

2 兩個實(shí)體類之間互相表示
(1)用戶里面表示所有角色泻轰,使用set集合

用戶實(shí)體類

(2)一個角色有多個用戶劫恒,使用set集合

角色實(shí)體類

3 配置映射關(guān)系
(1)基本配置
UserDemo.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>
<class name="entity.UserDemo" table="t_userdemo">
<id name="user_id" column="user_id">
    <generator class="native"></generator>
</id>
    <property name="user_name"></property>
    <property name="user_password"></property>
</class>
</hibernate-mapping>

Role.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>
<class name="entity.Role" table="t_role">
    <id name="role_id" column="role_id">
        <generator class="native"></generator>
    </id>
<property name="role_memo" column="role_memo"></property>
    <property name="role_name" column="role_name"></property>
</class>
</hibernate-mapping>

(2)配置多對多關(guān)系

  • 在用戶里面表示所有角色,使用set標(biāo)簽
UserDemo.hbm.xml
  • 在角色里面表示所有用戶,使用set標(biāo)簽
Role.hbm.xml

4 在核心配置文件中引入映射文件

        <mapping resource="UserDemo.hbm.xml"></mapping>
        <mapping resource="Role.hbm.xml"></mapping>

5 測試

數(shù)據(jù)庫查看

二 多對多級聯(lián)保存
需求:根據(jù)用戶保存角色
1 在用戶配置文件中set標(biāo)簽進(jìn)行配置仓手,cascade值save-update
2 創(chuàng)建用戶和角色對象,把角色放到用戶里面玻淑,最終保存用戶就可以了

import Utils.HibernateUtils;
import entity.Role;
import entity.UserDemo;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

public class HibernateManytoMany {
    @Test
    public void testSave(){
        Transaction tx = null;
        try{
           Session session= HibernateUtils.getSessionObject();
           tx = session.beginTransaction();
           //添加兩個用戶嗽冒,為每個用戶添加兩個角色
           //1 創(chuàng)建對象
            UserDemo userDemo =new UserDemo();
            userDemo.setUser_name("lucy");
            userDemo.setUser_password("123");
            UserDemo userDemo1 =new UserDemo();
            userDemo1.setUser_name("mary");
            userDemo1.setUser_password("1234");
            Role role = new Role();
            role.setRole_name("總經(jīng)理");
            role.setRole_memo("總經(jīng)理");
            Role role1 = new Role();
            role1.setRole_name("秘書");
            role.setRole_memo("秘書");
            Role role2 = new Role();
            role2.setRole_name("程序員");
            role2.setRole_memo("程序員");
            //2 建立關(guān)系,把角色放到用戶
            // user - - r1 , r2
            userDemo.getSetRole().add(role);
            userDemo.getSetRole().add(role1);
            // user1 - - r2 , r3
            userDemo1.getSetRole().add(role1);
            userDemo1.getSetRole().add(role2);
            //3 保存用戶
            session.save(userDemo);
            session.save(userDemo1);

           tx.commit();
        }catch (Exception e){
            e.printStackTrace();
            tx.rollback();
        }
    }
}
數(shù)據(jù)庫

三 多對多級聯(lián)刪除(了解)
1 在set標(biāo)簽進(jìn)行配置补履,casade值delete

配置

2 刪除

    @Test
    public void testDel(){
        Transaction tx = null;
        try {
            Session session= HibernateUtils.getSessionObject();
            tx = session.beginTransaction();
            UserDemo userDemo = session.get(UserDemo.class,1);
            session.delete(userDemo);

            tx.commit();
        }catch (Exception e){
            e.printStackTrace();
            tx.rollback();
        }
    }

四 維護(hù)第三張表
1 用戶和角色多對多關(guān)系添坊,維護(hù)關(guān)系通過第三張表維護(hù)
2 讓某個用戶有某個角色
(1)根據(jù)id查詢用戶和角色
(2)把角色放到用戶里面

  • 把角色對象放到用戶set集合
    @Test
    public void test3(){
        Transaction tx = null;
        try{
            Session session = HibernateUtils.getSessionObject();
            tx = session.beginTransaction();
            //讓某個用戶擁有某個角色
            //讓mary擁有總經(jīng)理角色
            //1 查詢mary和總經(jīng)理
            UserDemo mary = session.get(UserDemo.class,2);
            Role role= session.get(Role.class,1);
            //2 把角色放到用戶的set集合里面
            mary.getSetRole().add(role);
            
            tx.commit();
        }catch (Exception e){
            e.printStackTrace();
            tx.rollback();
        }
    }

3 讓某個用戶沒有角色
(1)根據(jù)id查詢用戶和角色
(2)從用戶里面把角色去除

  • 從set集合里面把角色移除
    @Test
    public void test4(){
        Transaction tx = null;
        try {
            Session session= HibernateUtils.getSessionObject();
            tx = session.beginTransaction();
            //讓某個用戶沒有有某個角色
            //讓mary沒有有總經(jīng)理角色
            //1 查詢mary和總經(jīng)理
            UserDemo mary = session.get(UserDemo.class,2);
            Role role= session.get(Role.class,1);
            //2 把角色從用戶的set集合里面移除
            mary.getSetRole().remove(role);

            tx.commit();
        }catch (Exception e){
            e.printStackTrace();
            tx.rollback();
        }
    }
數(shù)據(jù)庫
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市箫锤,隨后出現(xiàn)的幾起案子贬蛙,更是在濱河造成了極大的恐慌,老刑警劉巖谚攒,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件速客,死亡現(xiàn)場離奇詭異,居然都是意外死亡五鲫,警方通過查閱死者的電腦和手機(jī)溺职,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來位喂,“玉大人浪耘,你說我怎么就攤上這事∷苎拢” “怎么了七冲?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長规婆。 經(jīng)常有香客問我澜躺,道長,這世上最難降的妖魔是什么抒蚜? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任掘鄙,我火速辦了婚禮,結(jié)果婚禮上嗡髓,老公的妹妹穿的比我還像新娘操漠。我一直安慰自己,他們只是感情好饿这,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布浊伙。 她就那樣靜靜地躺著撞秋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嚣鄙。 梳的紋絲不亂的頭發(fā)上吻贿,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機(jī)與錄音哑子,去河邊找鬼廓八。 笑死,一個胖子當(dāng)著我的面吹牛赵抢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播声功,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼烦却,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了先巴?” 一聲冷哼從身側(cè)響起其爵,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎伸蚯,沒想到半個月后摩渺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剂邮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年摇幻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挥萌。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡绰姻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出引瀑,到底是詐尸還是另有隱情狂芋,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布憨栽,位于F島的核電站帜矾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏屑柔。R本人自食惡果不足惜屡萤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掸宛。 院中可真熱鬧灭衷,春花似錦、人聲如沸旁涤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瞳遍,卻和暖如春闻妓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掠械。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工由缆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人猾蒂。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓均唉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親肚菠。 傳聞我的和親對象是個殘疾皇子舔箭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)蚊逢,斷路器层扶,智...
    卡卡羅2017閱讀 134,693評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法烙荷,內(nèi)部類的語法镜会,繼承相關(guān)的語法,異常的語法终抽,線程的語...
    子非魚_t_閱讀 31,657評論 18 399
  • 1. 簡介 1.1 什么是 MyBatis 戳表? MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,527評論 0 4
  • 薄初年剛下飛機(jī)昼伴,就被路微音火急火燎的拽去了酒店扒袖,參加高中同學(xué)們的聚會。 一路上亩码,路微音絮絮叨叨的跟薄初年說著同學(xué)們...
    漁火晚舟閱讀 202評論 3 2
  • 你揮一揮衣袖描沟,作別校園的云彩飒泻,踏入了職場,從此吏廉,與你打交道最多的不再是你昔日的同學(xué)泞遗,而是現(xiàn)在的同事了。 老同事會不...
    東八線閱讀 2,166評論 0 50