Hibernate映射關(guān)系之多對多(三)

多對多的映射關(guān)系酒来,這里我用的是角色跟用戶兩個實(shí)體,一個用戶可能有多個角色肪凛,一個角色同時有多個用戶堰汉。
1、數(shù)據(jù)庫對象關(guān)系


多對多.png

2伟墙、實(shí)體關(guān)系


多對多實(shí)體關(guān)系.png

3翘鸭、建表
user表:

    CREATE TABLE user(
            user_id BIGINT(32) PRIMARY KEY auto_increment,
            user_name VARCHAR(32) not NULL,
            user_code VARCHAR(32) not NULL,
            user_password VARCHAR(32) not NULL
            )ENGINE=INNODB CHARSET=utf8;

role表:

CREATE TABLE role(
            role_id BIGINT(32) PRIMARY KEY auto_increment,
            role_name VARCHAR(32) not NULL,
            role_memo VARCHAR(128) DEFAULT NULL
            )ENGINE=INNODB CHARSET=utf8;

4、編寫實(shí)體與實(shí)體映射文件:

User.java

package com.nieshenkuan.model;

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

public class User {
//  CREATE TABLE user(
//          user_id BIGINT(32) PRIMARY KEY auto_increment,
//          user_name VARCHAR(32) not NULL,
//          user_code VARCHAR(32) not NULL,
//          user_password VARCHAR(32) not NULL
//          )ENGINE=INNODB CHARSET=utf8;
    private Long user_id;
    private String user_name;
    private String user_code;
    private String user_password;
    private Set<Role> roles=new HashSet<>();
    
    
    
    
    public Set<Role> getRoles() {
        return roles;
    }
    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }
    public Long getUser_id() {
        return user_id;
    }
    public void setUser_id(Long 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_code() {
        return user_code;
    }
    public void setUser_code(String user_code) {
        this.user_code = user_code;
    }
    public String getUser_password() {
        return user_password;
    }
    public void setUser_password(String user_password) {
        this.user_password = user_password;
    }
    
    
    
}

User.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-12-28 11:22:51 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping package="com.nieshenkuan.model">
    <class name="User" table="user" lazy="false">
        <id name="user_id" >
            <column name="user_id"></column>
            <generator class="native"></generator>
        </id>
        <property name="user_name"></property>
        <property name="user_code"></property>
        <property name="user_password"></property>
        
        
        
        <!-- 
            級聯(lián)操作
             save
             save-update
             delete
             all
             在多對多的時候戳葵,一般如果用的話就乓,只用save-update
             delete要慎用
             建議不使用
         -->
         
         <!-- 
            lazy:懶加載,延遲加載
            true
            false
            extra  極其懶惰
            
            fetch 用什么sql去查詢 
            select(默認(rèn)值)  單表查詢
            join   多表查詢
            subselect 子查詢
          -->
         
        <set name="roles" table="sys_user_role" cascade="all" lazy="true"  fetch="join" >
            <key>
                <column name="user_id"></column>
            </key>
            <many-to-many class="Role" column="role_id"></many-to-many>
        </set>
    </class>
</hibernate-mapping>

Role.java

package com.nieshenkuan.model;

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

public class Role {
//  CREATE TABLE role(
//          role_id BIGINT(32) PRIMARY KEY auto_increment,
//          role_name VARCHAR(32) not NULL,
//          role_memo VARCHAR(128) DEFAULT NULL
//          )ENGINE=INNODB CHARSET=utf8;
    
    private Long role_id;
    private String role_name;
    private String role_memo;
    private Set<User> users=new HashSet<>();
    
    
    
    
    public Set<User> getUsers() {
        return users;
    }
    public void setUsers(Set<User> users) {
        this.users = users;
    }
    public Long getRole_id() {
        return role_id;
    }
    public void setRole_id(Long 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;
    }
    
    
}

Role.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-12-28 11:22:51 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping package="com.nieshenkuan.model">
    <class name="Role" table="role">
        <id name="role_id" >
            <column name="role_id"></column>
            <generator class="native"></generator>
        </id>
        <property name="role_name"></property>
        <property name="role_memo"></property>
        
        <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>
    </class>
</hibernate-mapping>

5拱烁、測試

/**
     * 添加數(shù)據(jù)
     */
    @Test
    public  void test() {
        Session session = HibernateUtils.openSession();
        Transaction transaction = session.beginTransaction();
        // ---------------------------------------------
         User u1=new User();
         u1.setUser_name("小飛");
         u1.setUser_code("ww");
         u1.setUser_password("ww1");
         
         User u2=new User();
         u2.setUser_name("大飛");
         u2.setUser_code("ee");
         u2.setUser_password("ee2");
         
         Role role1=new Role();
         role1.setRole_name("設(shè)計師");
         
         Role role2=new Role();
         role2.setRole_name("程序員");
         
         u1.getRoles().add(role1);
         u1.getRoles().add(role2);
         
         u2.getRoles().add(role1);
         u2.getRoles().add(role2);
         
//       role1.getUsers().add(u1);
//       role1.getUsers().add(u2);
//       
//       role2.getUsers().add(u1);
//       role2.getUsers().add(u2);
         
         session.save(u1);
         session.save(u2);
         session.save(role1);
         session.save(role2);
         
        // ----------------------------------------------
        transaction.commit();
        session.close();
    }
    /**
     * 查詢數(shù)據(jù)
     */
    @Test
    public void fun1() {
        Session session = HibernateUtils.openSession();
        Transaction transaction = session.beginTransaction();
        // ---------------------------------------------
        
        //hibernate懶加載   
        //當(dāng)使用到對象的時候生蚁,才去執(zhí)行sql
        //絕大程度上是好的
         User user = session.load(User.class, 1l);
        Set<Role> roles=user.getRoles();
        for(Role role:roles) {
            System.out.println(role.getRole_name());
        }
        
         Role role = session.load(Role.class, 1l);
            Set<User> users=role.getUsers();
            for(User user_obj:users) {
                System.out.println(user_obj.getUser_name());
            }
        // ----------------------------------------------
        transaction.commit();
        session.close();
    }

總結(jié)

總結(jié):多對多的關(guān)系不需要建立外鍵,只是建立一個虛擬的中間表戏自。
只需要在兩個多的一方實(shí)體中都有一個對方實(shí)體的集合就可以了邦投。具體的實(shí)體映射文件詳解如下:
user對象的映射文件:
<set name="roles" table="sys_user_role" cascade="all" lazy="true"  fetch="join" >
            <key>
                <column name="user_id"></column>
            </key>
            <many-to-many class="Role" column="role_id"></many-to-many>
        </set>
配置詳解:
name:是user實(shí)體中set集合對象的對象名。
table:是中間表的名字擅笔,隨便取志衣。但是兩個中間表的名字要一樣。
key:user表中的主鍵名字作為中間表的一個字段
many-to-many中的:
class:是另一個多的一方的實(shí)體名
column:是另一個多的一方中主鍵名猛们。

當(dāng)然念脯,role的實(shí)體映射文件也是類似:如下
<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>

這里的name跟talbe以及key都不再講解了,跟上面一樣阅懦。
其實(shí)many-to-many也是一樣配置的和二。
class是另一個多的一方的實(shí)體名,
column是另一個多的一方中的主鍵名耳胎。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惯吕,一起剝皮案震驚了整個濱河市惕它,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌废登,老刑警劉巖淹魄,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異堡距,居然都是意外死亡甲锡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門羽戒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缤沦,“玉大人,你說我怎么就攤上這事易稠「追希” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵驶社,是天一觀的道長企量。 經(jīng)常有香客問我,道長亡电,這世上最難降的妖魔是什么届巩? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮份乒,結(jié)果婚禮上恕汇,老公的妹妹穿的比我還像新娘。我一直安慰自己冒嫡,他們只是感情好拇勃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著孝凌,像睡著了一般方咆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蟀架,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天瓣赂,我揣著相機(jī)與錄音,去河邊找鬼片拍。 笑死煌集,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的捌省。 我是一名探鬼主播苫纤,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了卷拘?” 一聲冷哼從身側(cè)響起喊废,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎栗弟,沒想到半個月后污筷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乍赫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年瓣蛀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雷厂。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡惋增,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出改鲫,到底是詐尸還是另有隱情器腋,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布钩杰,位于F島的核電站,受9級特大地震影響诊县,放射性物質(zhì)發(fā)生泄漏讲弄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一依痊、第九天 我趴在偏房一處隱蔽的房頂上張望避除。 院中可真熱鬧,春花似錦胸嘁、人聲如沸瓶摆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽群井。三九已至,卻和暖如春毫胜,著一層夾襖步出監(jiān)牢的瞬間书斜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工酵使, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荐吉,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓口渔,卻偏偏與公主長得像样屠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

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

  • 作為一種輕量級的關(guān)系映射工具痪欲,Hibernate支持各種關(guān)系映射悦穿,例如:多對一、一對多和一對一的數(shù)據(jù)庫表關(guān)系勤揩,通過...
    Ystrator閱讀 531評論 0 1
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法咧党,類相關(guān)的語法,內(nèi)部類的語法陨亡,繼承相關(guān)的語法傍衡,異常的語法,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,811評論 0 11
  • 月照木樨落,秋光驚別葉仰税。 紛擾無歡夢室琢,幽懷隨意愜。 鼓琴共風(fēng)鳴绣的,潑茶邀月接。 最是飄零客欲账,滄海一蝴蝶屡江。
    納蘭長君閱讀 198評論 0 0
  • 2017.11.30 第96天 你的思想,會變成你的言語赛不;你的言語惩嘉,會變成你的行動;注意你的行動踢故,它會變成你的習(xí)...
    鵑花開閱讀 144評論 0 0