• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Hibernate框架簡介④

    標簽: JAVA  Hibernate

    Hibernate的關聯映射:

    多對一關聯映射:

    第一步: 創建實體模型

    Emp類:

    package com.rl.hiber.model;
    
    import java.util.Date;
    
    public class Emp {
    
        private Integer empNo;
        
        private String ename;
        
        private Date birthday;
        
        private Integer gender;
        
        private String address;
        
        /**
         * 引入一的一端作為屬性, 建立多對一的關系
         */
        private Team team;
    
        public Integer getEmpNo() {
            return empNo;
        }
    
        public void setEmpNo(Integer empNo) {
            this.empNo = empNo;
        }
    
        public Team getTeam() {
            return team;
        }
    
        public void setTeam(Team team) {
            this.team = team;
        }
    
        public String getEname() {
            return ename;
        }
    
        public void setEname(String ename) {
            this.ename = ename;
        }
    
        public Date getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
    
        public Integer getGender() {
            return gender;
        }
    
        public void setGender(Integer gender) {
            this.gender = gender;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    }
    

    Team類:

    package com.rl.hiber.model;
    
    public class Team {
    
        private Integer tId;
        
        private String tName;
        
        private String loc;
    
        public Integer gettId() {
            return tId;
        }
    
        public void settId(Integer tId) {
            this.tId = tId;
        }
    
        public String gettName() {
            return tName;
        }
    
        public void settName(String tName) {
            this.tName = tName;
        }
    
        public String getLoc() {
            return loc;
        }
    
        public void setLoc(String loc) {
            this.loc = loc;
        }
    }
    

    第二步: 配置實體映射文件

    Emp.hbm.xml:

    <?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.rl.hiber.model">
        <class name="Emp" table="t_emp">
            <id name="empNo" column="emp_no">
                <generator class="native"></generator>
            </id>
            <property name="ename"></property>
            <property name="birthday"></property>
            <property name="gender"></property>
            <property name="address"></property>
            
            <!-- 指定多對一的關聯映射
                name: 多的一端中定義的一的一端的屬性, 也就是team
                column: 多的一端中的外鍵, 也就是一的一端中的主鍵, t_id
             -->
            <many-to-one name="team" column="t_id">
                
            </many-to-one>
        </class>
    </hibernate-mapping>        

    Team.hbm.xml:

    <?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.rl.hiber.model">
        <class name="Team" table="t_team">
            <id name="tId" column="t_id">
                <generator class="native"></generator>
            </id>
            <property name="tName" column="t_name"></property>
            <property name="loc"></property>
        </class>
        
    </hibernate-mapping>        

    hibernate.cfg.xml:

    生成建表腳本:

    數據庫建表結果:

    第三步: 測試多對一關聯映射

    測試代碼:

    package com.rl.hiber.test;
    
    import java.util.Date;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import com.rl.hiber.model.Emp;
    import com.rl.hiber.model.Team;
    import com.rl.hiber.utils.HibernateUtil;
    
    public class TestHibernate {
    
        @Test
        public void test1() {
            Session session = HibernateUtil.getSessoion();
            Transaction tx = session.beginTransaction();
            
            try {
                Team team = new Team();
                team.settName("公牛隊");
                team.setLoc("芝加哥");
                //保存球隊(要先保存球隊, 否則是瞬時對象)
                session.save(team);
                
                Emp emp1 = new Emp();
                Emp emp2 = new Emp();
                
                emp1.setEname("喬丹");
                emp1.setAddress("芝加哥");
                emp1.setGender(1);
                emp1.setBirthday(new Date());
                //設置隊員與球隊之間的關系
                emp1.setTeam(team);
                //保存隊員
                session.save(emp1);
                
                emp2.setAddress("芝加哥");
                emp2.setBirthday(new Date());
                emp2.setEname("菲爾");
                emp2.setGender(1);
                emp2.setTeam(team);
                session.save(emp2);
                
                //提交事務
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            }finally {
                HibernateUtil.closeResource(session);
            }
        }
    }

    hibernate發出sql語句:

    數據庫結果:

    下面講解一個知識點:

    級聯: 在"多的一端"設置cascade屬性

    直接貼代碼吧:

    <?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.rl.hiber.model">
        <class name="Emp" table="t_emp">
            <id name="empNo" column="emp_no">
                <generator class="native"></generator>
            </id>
            <property name="ename"></property>
            <property name="birthday"></property>
            <property name="gender"></property>
            <property name="address"></property>
            
            <!-- 指定多對一的關聯映射
                name: 多的一端中定義的一的一端的屬性, 也就是team
                column: 多的一端中的外鍵, 也就是一的一端中的主鍵, t_id
                cascade: delete(刪除多的一端會直接上一的一端也刪除, 即 刪除隊員也會把球隊給刪掉), 在多的一端不建議使用
                        save-update(保存或者更新多的一端時, 一的一端也會自動先做保存或更新, 即 不需要先保存球隊), 建議使用
                        all:包含以上兩種
                        none: 沒有級聯(默認狀態)
             -->
            <many-to-one name="team" column="t_id" cascade="save-update">
                
            </many-to-one>
        </class>
    </hibernate-mapping>        

    測試級聯狀態為save-update代碼:

    package com.rl.hiber.test;
    
    import java.util.Date;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import com.rl.hiber.model.Emp;
    import com.rl.hiber.model.Team;
    import com.rl.hiber.utils.HibernateUtil;
    
    public class TestHibernate {
    
        
        
        /**
         * 將級聯狀態設置為save-update時不需要先保存球隊(一的一端)
         */
        @Test
        public void test2() {
            Session session = HibernateUtil.getSessoion();
            Transaction tx = session.beginTransaction();
            
            try {
                Team team = new Team();
                team.settName("小牛隊");
                team.setLoc("達拉斯");
                
                Emp emp1 = new Emp();
                Emp emp2 = new Emp();
                
                emp1.setEname("庫班");
                emp1.setAddress("達拉斯");
                emp1.setGender(1);
                emp1.setBirthday(new Date());
                //設置隊員與球隊之間的關系
                emp1.setTeam(team);
                //保存隊員
                session.save(emp1);
                
                emp2.setAddress("達拉斯");
                emp2.setBirthday(new Date());
                emp2.setEname("諾維斯基");
                emp2.setGender(1);
                emp2.setTeam(team);
                session.save(emp2);
                
                //提交事務
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            }finally {
                HibernateUtil.closeResource(session);
            }
        }
    }

     

    hibernate發出sql語句:

    數據庫結果:

    一對一單端關聯映射:

    映射文件:

    <?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.rl.hiber.model">
        <class name="IDCard" table="t_id_card">
        <!-- 
                    指定idcard的主鍵名稱, 建議跟emp端的主鍵名稱相同
         -->
            <id name="cardId" column="emp_no">
            <!-- 
                        使用外鍵的方式來生成主鍵
             -->
                <generator class="foreign">
                <!-- 
                                指定idcard這一端的emp屬性
                 -->
                    <param name="property">emp</param>
                </generator>
            </id>
            <property name="cardNo" column="card_no"></property>
            <!-- 一對一關聯映射
                 name: 指定idcard這一端中定義的另一個一的一端的屬性(即emp)
                 constrained: true(即建表外鍵約束), 當要刪除隊員信息時必須先刪除idcard
             -->
            <one-to-one name="emp" constrained="true"></one-to-one>
        </class>
    </hibernate-mapping>        

    測試代碼:

    package com.rl.hiber.test;
    
    import java.util.Date;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import com.rl.hiber.model.Emp;
    import com.rl.hiber.model.IDCard;
    import com.rl.hiber.utils.HibernateUtil;
    
    public class TestHibernate {
    
        @Test
        public void testAdd() {
            Session session = HibernateUtil.getSessoion();
            Transaction tx = session.beginTransaction();
            
            try {
                Emp emp = new Emp();
                emp.setAddress("廣州");
                emp.setBirthday(new Date());
                emp.setEname("張三");
                emp.setGender(1);
                
                IDCard card = new IDCard();
                card.setCardNo("111");
                card.setEmp(emp);
                //此時并沒有設置級聯, 但hibernate會自動在保存idcard時先保存emp
                //因為如果不保存emp則無法返回主鍵, 它們倆是共用主鍵的以保證一對一關系
                session.save(card);
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            }finally {
                HibernateUtil.closeResource(session);
            }
        }
    }

    數據庫結果:

    一對一雙向映射

    Emp表的配置文件:

    <?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.rl.hiber.model">
        <class name="Emp" table="t_emp">
            <id name="empNo" column="emp_no">
                <generator class="native"></generator>
            </id>
            <property name="ename"></property>
            <property name="birthday"></property>
            <property name="gender"></property>
            <property name="address"></property>
            <!-- 指定一對一關聯映射關系 -->
            <one-to-one name="card"></one-to-one>
        </class>
    </hibernate-mapping>        

    測試代碼:

    package com.rl.hiber.test;
    
    import java.util.Date;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import com.rl.hiber.model.Emp;
    import com.rl.hiber.model.IDCard;
    import com.rl.hiber.utils.HibernateUtil;
    
    public class TestHibernate {
    
        
        @Test
        public void testAdd() {
            Session session = HibernateUtil.getSessoion();
            Transaction tx = session.beginTransaction();
            
            try {
                Emp emp = new Emp();
                emp.setAddress("北京");
                emp.setBirthday(new Date());
                emp.setEname("李四");
                emp.setGender(1);
                
                IDCard card = new IDCard();
                card.setCardNo("123");
                
                emp.setCard(card);
                card.setEmp(emp);
                session.save(emp);
                session.save(card);
                
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            }finally {
                HibernateUtil.closeResource(session);
            }
        }
    }

    數據庫結果同上的一對一單端映射

    一對多單向關聯映射:

    在多對一的基礎上修改:

    Emp配置文件:

    <?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.rl.hiber.model">
        <class name="Emp" table="t_emp">
            <id name="empNo" column="emp_no">
                <generator class="native"></generator>
            </id>
            <property name="ename"></property>
            <property name="birthday"></property>
            <property name="gender"></property>
            <property name="address"></property>
            
        </class>
    </hibernate-mapping>        

    Team配置文件:

    <?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.rl.hiber.model">
        <class name="Team" table="t_team">
            <id name="tId" column="t_id">
                <generator class="native"></generator>
            </id>
            <property name="tName" column="t_name"></property>
            <property name="loc"></property>
            
            <!-- 指定一對多關聯映射
                name: 在一的一端指定一個多的一端的集合屬性emps
                key:->column: 多的一端里面有一個一的一端的外鍵t_id
                one-to-many:->class: 多的一端所在的位置(默認已經指定了com.rl.hiber.model)
             -->
            <set name="emps">
                <key column="t_id"></key>
                <one-to-many class="Emp"/>
            </set>
        </class>
        
    </hibernate-mapping>        

    測試代碼:

    package com.rl.hiber.test;
    
    import java.util.Date;
    import java.util.HashSet;
    import java.util.Set;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import com.rl.hiber.model.Emp;
    import com.rl.hiber.model.Team;
    import com.rl.hiber.utils.HibernateUtil;
    
    public class TestHibernate {
        
        @Test
        public void testAdd() {
            Session session = HibernateUtil.getSessoion();
            Transaction tx = session.beginTransaction();
            
            try {
                Emp emp = new Emp();
                emp.setAddress("芝加哥");
                emp.setBirthday(new Date());
                emp.setEname("喬丹");
                emp.setGender(1);
                //保存隊員
                session.save(emp);
                
                Emp emp1 = new Emp();
                emp1.setAddress("芝加哥");
                emp1.setBirthday(new Date());
                emp1.setEname("菲爾");
                emp1.setGender(1);
                //
                session.save(emp1);
                
                Set<Emp> emps = new HashSet<Emp>();
                emps.add(emp);
                emps.add(emp1);
                
                Team team = new Team();
                team.setLoc("芝加哥");
                team.settName("公牛隊");
                //指定一對多的關系
                team.setEmps(emps);
                //保存球隊
                session.save(team);
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            }finally {
                HibernateUtil.closeResource(session);
            }
        }
    }

    數據庫結果:

    設置級聯:

    測試代碼:

    package com.rl.hiber.test;
    
    import java.util.Date;
    import java.util.HashSet;
    import java.util.Set;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import com.rl.hiber.model.Emp;
    import com.rl.hiber.model.Team;
    import com.rl.hiber.utils.HibernateUtil;
    
    public class TestHibernate {
        
        @Test
        public void testAdd() {
            Session session = HibernateUtil.getSessoion();
            Transaction tx = session.beginTransaction();
            
            try {
                Emp emp = new Emp();
                emp.setAddress("達拉斯");
                emp.setBirthday(new Date());
                emp.setEname("庫班");
                emp.setGender(1);
                
                Emp emp1 = new Emp();
                emp1.setAddress("達拉斯");
                emp1.setBirthday(new Date());
                emp1.setEname("諾維斯基");
                emp1.setGender(1);
                
                Set<Emp> emps = new HashSet<Emp>();
                emps.add(emp);
                emps.add(emp1);
                
                Team team = new Team();
                team.setLoc("達拉斯");
                team.settName("小牛隊");
                team.setEmps(emps);
                //保存球隊時就會自動保存隊員
                session.save(team);
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            }finally {
                HibernateUtil.closeResource(session);
            }
        }
    }

    數據庫結果:

    一對多雙向映射:

    一對多是有缺陷的, 保存的時候如果多的一端的外鍵是非空字段, 那么保存就會出錯.

    跟多對一類似, 有點小區別:

    需要在一對多的基礎上再在多的一端指定多對一的關系, 就不貼代碼了

    Emp.hbm.xml:

    <?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.rl.hiber.model">
        <class name="Emp" table="t_emp">
            <id name="empNo" column="emp_no">
                <generator class="native"></generator>
            </id>
            <property name="ename"></property>
            <property name="birthday"></property>
            <property name="gender"></property>
            <property name="address"></property>
            <!-- 指定多對一的關聯映射
                name: 多的一端中定義的一的一端的屬性, 也就是team
                column: 多的一端中的外鍵, 也就是一的一端中的主鍵, t_id
                                            這個外鍵必須跟team.hbm.xml指定的外鍵一樣, 如果兩個column的名稱不一樣則相當于有兩個外鍵就沖突了
             -->
            <many-to-one name="team" column="t_id" />
        </class>
    </hibernate-mapping>        

    Team.hbm.xml同上

    測試代碼同多對一.

    真正的解決非空字段的方法, 如果真的有需求需要在一的一端進行保存的話, 可以在Team.hbm.xml設置反轉:
     

    <?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.rl.hiber.model">
        <class name="Team" table="t_team">
            <id name="tId" column="t_id">
                <generator class="native"></generator>
            </id>
            <property name="tName" column="t_name"></property>
            <property name="loc"></property>
            
            <!-- 指定一對多關聯映射
                name: 在一的一端指定一個多的一端的集合屬性emps
                key:->column: 多的一端里面有一個一的一端的外鍵t_id
                one-to-many:->class: 多的一端所在的位置(默認已經指定了com.rl.hiber.model)
                inverser: 設置反轉, 表面上用一的一端進行保存, 實際上反轉給多的一端進行保存
             -->
            <set name="emps" cascade="save-update" inverse="true">
                <key column="t_id"></key>
                <one-to-many class="Emp"/>
            </set>
        </class>
        
    </hibernate-mapping>        

    測試代碼:

    package com.rl.hiber.test;
    
    import java.util.Date;
    import java.util.HashSet;
    import java.util.Set;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import com.rl.hiber.model.Emp;
    import com.rl.hiber.model.Team;
    import com.rl.hiber.utils.HibernateUtil;
    
    public class TestHibernate {
        
      
        
        @Test
        public void testAdd2() {
            Session session = HibernateUtil.getSessoion();
            Transaction tx = session.beginTransaction();
            
            try {
                Team team = new Team();
                team.setLoc("達拉斯");
                team.settName("小牛隊");
                
                Emp emp = new Emp();
                emp.setAddress("達拉斯");
                emp.setBirthday(new Date());
                emp.setEname("庫班");
                emp.setGender(1);
                //利用隊員指定多對一
                emp.setTeam(team);
                
                Emp emp1 = new Emp();
                emp1.setAddress("達拉斯");
                emp1.setBirthday(new Date());
                emp1.setEname("諾維斯基");
                emp1.setGender(1);
                emp1.setTeam(team);
                
                Set<Emp> emps = new HashSet<Emp>();
                emps.add(emp);
                emps.add(emp1);
                
                team.setEmps(emps);
                //只保存球隊, 實際上會反轉給多的一端進行保存
                session.save(team);
                
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            }finally {
                HibernateUtil.closeResource(session);
            }
        }
    }

    結果相同

    單端多對多關聯映射:

    Emp類需要加上另一端的屬性, 并提供set跟get方法, 就不貼代碼了

    配置文件:

    Emp.hbm.xml:

    <?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.rl.hiber.model">
        <class name="Emp" table="t_emp">
            <id name="empNo" column="emp_no">
                <generator class="native"></generator>
            </id>
            <property name="ename"></property>
            <property name="birthday"></property>
            <property name="gender"></property>
            <property name="address"></property>
            
            <!-- 指定多對多關系
                table: 中間表
             -->
            <set name="roles" table="emp_role">
            <!-- emp端的外鍵, 也就是emp_no主鍵 -->
                <key column="emp_no"></key>
                <!-- 
                    class: 另一端的路徑
                    column: 另一端的外鍵, 也就是role_id主鍵
                 -->
                <many-to-many class="Role" column="role_id"></many-to-many>
            </set>
        </class>
    </hibernate-mapping>        

    Role.hbm.xml:

    <?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.rl.hiber.model">
        <class name="Role" table="t_role">
            <id name="roleId" column="role_id">
                <generator class="native"></generator>
            </id>
            <property name="roleName" column="role_name"></property>
            <property name="roleDesc" column="role_desc"></property>
        </class>
    </hibernate-mapping>        

    生成數據庫表:

     

    測試代碼:

    package com.rl.hiber.test;
    
    import java.util.Date;
    import java.util.HashSet;
    import java.util.Set;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import com.rl.hiber.model.Emp;
    import com.rl.hiber.model.Role;
    import com.rl.hiber.utils.HibernateUtil;
    
    public class TestHibernate {
        
        @Test
        public void testAdd() {
            
            Session session = HibernateUtil.getSessoion();
            Transaction tx = session.beginTransaction();
            
            try {
                Emp emp = new Emp();
                emp.setAddress("上海");
                emp.setBirthday(new Date());
                emp.setEname("田七");
                emp.setGender(1);
                
                Role role1 = new Role();
                role1.setRoleDesc("講課");
                role1.setRoleName("老師");
                session.save(role1);
                
                Role role2 = new Role();
                role2.setRoleDesc("管理");
                role2.setRoleName("總監");
                session.save(role2);
                
                Set<Role> roles = new HashSet<Role>();
                roles.add(role1);
                roles.add(role2);
                
                emp.setRoles(roles);
                session.save(emp);
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            }finally {
                HibernateUtil.closeResource(session);
            }
        }
    }

    數據庫結果:

    同樣也可以設置級聯, 就不舉例了.

     

    多對多的雙向關聯:

    Role類需要加上另一端的屬性, 并提供set跟get方法

    在原來的基礎上修改Role.hbm.xml, 

    <?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.rl.hiber.model">
        <class name="Role" table="t_role">
            <id name="roleId" column="role_id">
                <generator class="native"></generator>
            </id>
            <property name="roleName" column="role_name"></property>
            <property name="roleDesc" column="role_desc"></property>
            
            <!-- 指定多對多關系(需中間表) -->
            <set name="emps" table="emp_role" cascade="save-update">
            <!-- key:->column: role端的外鍵, role_id -->
                <key column="role_id"></key>
                <!-- class: 另一端的路徑  column: 另一端的外鍵emp_no -->
                <many-to-many class="Emp" column="emp_no"></many-to-many>
            </set>
        </class>
    </hibernate-mapping>        

    測試代碼:

    package com.rl.hiber.test;
    
    import java.util.Date;
    import java.util.HashSet;
    import java.util.Set;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import com.rl.hiber.model.Emp;
    import com.rl.hiber.model.Role;
    import com.rl.hiber.utils.HibernateUtil;
    
    public class TestHibernate {
        
        
        
        /**
         * 采用級聯的方式
         */
        @Test
        public void testAdd2() {
            
            Session session = HibernateUtil.getSessoion();
            Transaction tx = session.beginTransaction();
            
            try {
                
                Emp emp = new Emp();
                emp.setAddress("上海");
                emp.setBirthday(new Date());
                emp.setEname("田七");
                emp.setGender(1);
                
                Emp emp2 = new Emp();
                emp2.setAddress("天津");
                emp2.setBirthday(new Date());
                emp2.setEname("周八");
                emp2.setGender(2);
                
                Set<Emp> emps = new HashSet<Emp>();
                emps.add(emp);
                emps.add(emp2);
                
                Role role1 = new Role();
                role1.setRoleDesc("講課");
                role1.setRoleName("老師");
                role1.setEmps(emps);
                session.save(role1);
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            }finally {
                HibernateUtil.closeResource(session);
            }
        }
    }

    數據庫結果:

    版權聲明:本文為ip_JL原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/ip_JL/article/details/81583538

    智能推薦

    Hibernate框架

    Hibernate是一個開放源代碼的對象關系映射框架(ORM),它對JDBC進行了非常輕量級的對象封裝,簡化了java應用程序與數據庫交互的開發。簡化了數據創建,數據處理和數據訪問。 ①面向對象操作:將對數據庫的操作轉換為對Java對象的操作。 ②數據庫獨立查詢:通過配置對應的數據庫“方言”,就可以根據不同類型的數據庫生成適合的SQL語句。 ③非侵入式:Hibernate不...

    Hibernate框架

    Hibernate框架 1、簡介 Hibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行了非常輕量級的對象封裝,它將POJO與數據庫表建立映射關系,是一個全自動的orm框架,hibernate可以自動生成SQL語句,自動執行,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序使用,也可以在S...

    MyBatis簡介和Hibernate簡介

    MyBatis簡介 MyBatis的前身是Apache的開源項目iBatis。iBatis一次來源于internet,和abatis的組合,是一個基于Java持久層架構。2010年這個項目由Apache software foundation遷移到Google code,并更名為MyBatis。2013年11月,MyBatis遷移到Github上,目前由Github提供維護。 MyBatis的優勢...

    Hibernate配置和簡介

    Hibernate構架 Hibernate 什么是hibernate? 在了解hibernate之前我們先來了解一下什么是ORM: ORM是怎么工作的? hibernate概念: hibernate的優點: Hibernate環境配置 在eclipse上配置Hibernate 在IDEA上配置Hibernate Hibernate配置步驟: Hibernate的核心接口 1.Configurati...

    Hibernate 框架學習——Hibernate注解

    前言 在Hibernate中我們一般都會使用注解,這樣可以幫助我們大大簡化hbm映射文件的配置。下面我就來為大家詳細介紹。 PO類注解配置 首先肯定是搭建好Hibernate的開發環境啦,我在此也不過多贅述,讀者自行實踐。接著在src目錄下創建一個cn.itheima.domain包,并在該包下創建一個Book實體類,由于Book實體類中寫有注解配置,所以就不用編寫那個映射配置文件啦! 下面我就來...

    猜你喜歡

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡