java框架Hibernate的一對(duì)多與多對(duì)一映射


一對(duì)多與多對(duì)一映射實(shí)現(xiàn)步驟
javaBean類
  • 部門類
public class Dept {

    private int deptId;
    private String deptName;
    private Set<Employee> emps;

    public int getDeptId(){
        return deptId;
    }

    public void setDeptId(int deptId){
        this.deptId = deptId;
    }

    public String getDeptName(){
        return deptName;
    }

    public void setDeptName(String deptName){
        this.deptName = deptName;
    }

    public Set<Employee> getEmps(){
        return emps;
    }

    public void setEmps(Set<Employee> emps){
        this.emps = emps;
    }
}
  • 員工類
public class Employee {

    private int empId;
    private String empName;
    private double salary;
    // [多對(duì)一]員工與部門
    private Dept dept;

    public int getEmpId(){
        return empId;
    }

    public void setEmpId(int empId){
        this.empId = empId;
    }

    public String getEmpName(){
        return empName;
    }

    public void setEmpName(String empName){
        this.empName = empName;
    }

    public double getSalary(){
        return salary;
    }

    public void setSalary(double salary){
        this.salary = salary;
    }

    public Dept getDept(){
        return dept;
    }

    public void setDept(Dept dept){
        this.dept = dept;
    }
}
配置文件設(shè)置
  • 部門的配置文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.flynn.one2many">
    <class name="Dept" table="t_dept">

        <id name="deptId">
            <generator class="native"/>
        </id>
        <property name="deptName"></property>

        <!--
            一對(duì)多關(guān)聯(lián)映射的配置(通過部門管理到員工)
            Dept 映射關(guān)鍵點(diǎn):
                1.  指定 映射的集合屬性: "emps"
                2.  集合屬性對(duì)應(yīng)的集合表: "t_employee"
                3.  集合表的外鍵字段   "t_employee. dept_id"
                4.  集合元素的類型
        -->
        <set name="emps" table="t_employee">
            <key column="dept_id"></key>
            <one-to-many class="Employee"></one-to-many>
        </set>
    </class>
</hibernate-mapping>
  • 員工的配置文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.flynn.one2many">
    <class name="Employee" table="t_employee">

        <id name="empId">
            <generator class="native"/>
        </id>
        <property name="empName" length="20"></property>
        <property name="salary" type="double"></property>

        <!--
            多對(duì)一映射配置
            Employee 映射關(guān)鍵點(diǎn):
                1.  映射的部門屬性  :  dept
                2.  映射的部門對(duì)象拱层,對(duì)應(yīng)的外鍵字段: dept_id
                3.  部門的類型
        -->
        <many-to-one name="dept" column="dept_id" class="Dept"></many-to-one>

    </class>
</hibernate-mapping>
測(cè)試
    @Test
    public void testSaveDept(){
        Session session = sessionFactory.openSession();
        session.beginTransaction();

        // 部門對(duì)象
        Dept dept = new Dept();
        dept.setDeptName("app developer");
        // 員工對(duì)象
        com.flynn.one2many.Employee emp_zs = new com.flynn.one2many.Employee();
        emp_zs.setEmpName("zhangsan");
        com.flynn.one2many.Employee emp_ls = new com.flynn.one2many.Employee();
        emp_ls.setEmpName("lishi");
        // 關(guān)系
        Set<com.flynn.one2many.Employee> set = new HashSet<>();
        set.add(emp_zs);
        set.add(emp_ls);
        dept.setEmps(set);
        // 保存
        session.save(emp_zs);
        session.save(emp_ls);
        session.save(dept); // 保存部門 部門下所有的員工

        session.getTransaction().commit();
        session.close();
        /*
            控制臺(tái)Hibernate的打印:
            Hibernate: insert into t_employee (empName, salary, dept_id) values (?, ?, ?)
            Hibernate: insert into t_employee (empName, salary, dept_id) values (?, ?, ?)
            Hibernate: insert into t_dept (deptName) values (?)
            Hibernate: update t_employee set deptId=? where empId=?
            Hibernate: update t_employee set deptId=? where empId=?
         */
    }

// [推薦] 保存, 部員方[多的一方操作]
    @Test
    public void testSaveEmp(){
        Session session = sessionFactory.openSession();
        session.beginTransaction();

        // 部門對(duì)象
        Dept dept = new Dept();
        dept.setDeptName("java developer");
        // 員工對(duì)象
        com.flynn.one2many.Employee emp_zs = new com.flynn.one2many.Employee();
        emp_zs.setEmpName("zhangsan");
        com.flynn.one2many.Employee emp_ls = new com.flynn.one2many.Employee();
        emp_ls.setEmpName("lishi");
        // 關(guān)系
        emp_zs.setDept(dept);
        emp_ls.setDept(dept);
        // 保存
        session.save(dept);  // 先保存一的方法
        session.save(emp_zs);
        session.save(emp_ls); // 再保存多的一方, 關(guān)系會(huì)自動(dòng)維護(hù)(映射配置完)

        session.getTransaction().commit();
        session.close();
        /*
            Hibernate: insert into t_dept (deptName) values (?)
            Hibernate: insert into t_employee (empName, salary, dept_id) values (?, ?, ?)
            Hibernate: insert into t_employee (empName, salary, dept_id) values (?, ?, ?)
         */
    }


    /**
     * 獲取數(shù)據(jù)
     */
    @Test
    public void testDeptOrEmp(){
        Session session = sessionFactory.openSession();
        session.beginTransaction();

        // 1.通過部門方, 獲取另外一方
        Dept dept = (Dept) session.get(Dept.class, 1);
        System.out.println(dept.getDeptName());
        System.out.println(dept.getEmps()); // 懶加載

        // 2.通過員工方, 獲取另外一方
        com.flynn.one2many.Employee employee = (com.flynn.one2many.Employee) session.get(com.flynn.one2many.Employee.class, 1);
        System.out.println(employee.getEmpName());
        System.out.println(employee.getDept());
    }

在一對(duì)多與多對(duì)一的關(guān)聯(lián)關(guān)系中, 保存數(shù)據(jù)最好的通過多的一方來維護(hù)關(guān)系, 這樣可以減少update語句的生成, 從而提高 hibernate 的執(zhí)行效率 !

配置一對(duì)多與多對(duì)一 , 這種叫"雙向關(guān)聯(lián)"
只配置一對(duì)多 , 叫"單項(xiàng)一對(duì)多"
只配置多對(duì)一, 叫"單項(xiàng)多對(duì)一"

注意:

  • 配置了哪一方, 哪一方才有維護(hù)關(guān)聯(lián)關(guān)系的權(quán)限!

Inverse屬性

Inverse屬性,是在維護(hù)關(guān)聯(lián)關(guān)系的時(shí)候起作用的态贤。
表示控制權(quán)是否轉(zhuǎn)移舱呻。(在一的一方起作用)

Inverse , 控制反轉(zhuǎn)醋火。
Inverse = false 不反轉(zhuǎn)悠汽; 當(dāng)前方有控制權(quán)
True 控制反轉(zhuǎn); 當(dāng)前方?jīng)]有控制權(quán)

維護(hù)關(guān)聯(lián)關(guān)系中芥驳,是否設(shè)置inverse屬性:

    1. 保存數(shù)據(jù)
      有影響柿冲。
      如果設(shè)置控制反轉(zhuǎn),即inverse=true, 然后通過部門方維護(hù)關(guān)聯(lián)關(guān)系。在保存部門的時(shí)候兆旬,同時(shí)保存員工假抄, 數(shù)據(jù)會(huì)保存,但關(guān)聯(lián)關(guān)系不會(huì)維護(hù)丽猬。即外鍵字段為NULL
      image.png
    1. 獲取數(shù)據(jù)
      無宿饱。
    1. 解除關(guān)聯(lián)關(guān)系?
      有影響脚祟。
    • inverse=false谬以, 可以解除關(guān)聯(lián)
    • inverse=true, 當(dāng)前方(部門)沒有控制權(quán)由桌,不能解除關(guān)聯(lián)關(guān)系 (不會(huì)生成update語句,也不會(huì)報(bào)錯(cuò))
    1. 刪除數(shù)據(jù)對(duì)關(guān)聯(lián)關(guān)系的影響为黎?
      有影響。
    • inverse=false, 有控制權(quán)行您, 可以刪除铭乾。先清空外鍵引用,再刪除數(shù)據(jù)娃循。
    • inverse=true, 沒有控制權(quán): 如果刪除的記錄有被外鍵引用炕檩,會(huì)報(bào)錯(cuò),違反主外鍵引用約束捌斧! 如果刪除的記錄沒有被引用捧书,可以直接刪除事扭。
cascade 屬性

cascade 表示級(jí)聯(lián)操作 【可以設(shè)置到一的一方或多的一方】

  • none 不級(jí)聯(lián)操作陆盘, 默認(rèn)值
  • save-update 級(jí)聯(lián)保存或更新
  • delete 級(jí)聯(lián)刪除
  • save-update,delete 級(jí)聯(lián)保存、更新绘雁、刪除
  • all 同上洞难。級(jí)聯(lián)保存舆吮、更新、刪除
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市色冀,隨后出現(xiàn)的幾起案子潭袱,更是在濱河造成了極大的恐慌,老刑警劉巖锋恬,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屯换,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡与学,警方通過查閱死者的電腦和手機(jī)彤悔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來索守,“玉大人晕窑,你說我怎么就攤上這事÷逊穑” “怎么了杨赤?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)截汪。 經(jīng)常有香客問我疾牲,道長(zhǎng),這世上最難降的妖魔是什么衙解? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任阳柔,我火速辦了婚禮,結(jié)果婚禮上丢郊,老公的妹妹穿的比我還像新娘盔沫。我一直安慰自己,他們只是感情好枫匾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布架诞。 她就那樣靜靜地躺著,像睡著了一般干茉。 火紅的嫁衣襯著肌膚如雪谴忧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天角虫,我揣著相機(jī)與錄音沾谓,去河邊找鬼。 笑死戳鹅,一個(gè)胖子當(dāng)著我的面吹牛均驶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播枫虏,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼妇穴,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼爬虱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起腾它,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤跑筝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后瞒滴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體曲梗,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年妓忍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了虏两。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡单默,死狀恐怖碘举,靈堂內(nèi)的尸體忽然破棺而出忘瓦,到底是詐尸還是另有隱情搁廓,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布耕皮,位于F島的核電站境蜕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏凌停。R本人自食惡果不足惜粱年,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望罚拟。 院中可真熱鬧台诗,春花似錦、人聲如沸赐俗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阻逮。三九已至粱快,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叔扼,已是汗流浹背事哭。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓜富,地道東北人鳍咱。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像与柑,于是被迫代替她去往敵國(guó)和親谤辜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子澎现,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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

  • 集合映射 開發(fā)流程:需求分析/數(shù)據(jù)庫(kù)設(shè)計(jì)、項(xiàng)目設(shè)計(jì)/ 編碼/測(cè)試/實(shí)施部署上線/驗(yàn)收 需求 : 用戶購(gòu)買每辟, 填寫地...
    奮斗的老王閱讀 912評(píng)論 0 51
  • 本文包括:1剑辫、一對(duì)多結(jié)構(gòu)的準(zhǔn)備2、雙向關(guān)聯(lián)與單向關(guān)聯(lián)3渠欺、級(jí)聯(lián)保存4妹蔽、級(jí)聯(lián)刪除5、cascade 屬性——級(jí)聯(lián)6挠将、i...
    廖少少閱讀 1,226評(píng)論 1 6
  • 這部分主要是開源Java EE框架方面的內(nèi)容胳岂,包括Hibernate、MyBatis舔稀、Spring乳丰、Spring ...
    雜貨鋪老板閱讀 1,381評(píng)論 0 2
  • 多對(duì)多映射開發(fā) javaBean 項(xiàng)目Bean 項(xiàng)目成員Bean 項(xiàng)目對(duì)象映射 項(xiàng)目成員映射文件 測(cè)試 維護(hù)關(guān)聯(lián)關(guān)...
    _琳哥閱讀 236評(píng)論 0 0
  • 1、葉子都長(zhǎng)在莖上内贮,但它們的生長(zhǎng)方式并不相同: 2产园、《水滸傳》 “及時(shí)雨”宋江仗義疏財(cái),眾好漢擁戴夜郁!他提出的...
    吳曉妮閱讀 261評(píng)論 0 0