zoukankan      html  css  js  c++  java
  • java:Hibernate框架2(关联映射(多对一,一对多,一对多双向,一对一主键,一对一唯一外键,多对多双向))

     

      hibernate.cfg.xml:

      

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
        <session-factory>
            <!--驱动名称,URL,用户名,密码 -->
            <property name="connection.driver_class">
                com.mysql.jdbc.Driver
            </property>
            <property name="connection.url">
                jdbc:mysql://localhost:3306/test
            </property>
            <property name="connection.username">root</property>
            <property name="connection.password">root</property>
            <!--方言 -->
            <property name="hibernate.dialect">
                org.hibernate.dialect.MySQL5Dialect
            </property>
            <!-- 输出SQL语句 -->
            <property name="show_sql">true</property>
            <!-- 格式化SQL语句 -->
            <property name="format_sql">true</property>
            <!-- 根据映射文件生产表: create:创建(不推荐:先删除原有表,重新创建表,原有数据丢失) update:创建+更新记录(推荐,会保存原有数据) -->
            <property name="hbm2ddl.auto">update</property>
            <mapping resource="cn/zzsxt/entity/Classinfo.hbm.xml" />
            <mapping resource="cn/zzsxt/entity/Studentinfo.hbm.xml" />
            
            <mapping resource="cn/zzsxt/entity2/Employee.hbm.xml" />
            <mapping resource="cn/zzsxt/entity2/Dept.hbm.xml" />
            
            <mapping resource="cn/zzsxt/entity3/Province.hbm.xml" />
            <mapping resource="cn/zzsxt/entity3/City.hbm.xml" />
            
            <mapping resource="cn/zzsxt/entity4/IdCard.hbm.xml" />
            <mapping resource="cn/zzsxt/entity4/Person.hbm.xml" />
            
            <mapping resource="cn/zzsxt/entity5/IdCard2.hbm.xml" />
            <mapping resource="cn/zzsxt/entity5/Person2.hbm.xml" />
            
            <mapping resource="cn/zzsxt/entity6/Emp.hbm.xml" />
            <mapping resource="cn/zzsxt/entity6/Project.hbm.xml" />
    
        </session-factory>
    </hibernate-configuration>    
    
        

     

    1.单向多对一:

     

      Classinfo:

      

    package cn.zzsxt.entity;
    
    import java.io.Serializable;
    
    public class Classinfo implements Serializable {
        private int classId;
        private String className;
        
        public int getClassId() {
            return classId;
        }
        public void setClassId(int classId) {
            this.classId = classId;
        }
        public String getClassName() {
            return className;
        }
        public void setClassName(String className) {
            this.className = className;
        }
        
    }

      Classinfo.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 package="cn.zzsxt.entity">
        <class name="Classinfo">
            <id name="classId">
                <generator class="native"></generator>
            </id>
            <property name="className"></property>
        </class>
    </hibernate-mapping>    

      Studentinfo:

    package cn.zzsxt.entity;
    
    import java.io.Serializable;
    
    public class Studentinfo implements Serializable {
        private int studentId;
        private String studentName;
        private int studentAge;
        private String studentAddress;
        //和一方关联的实体对象(多对一)
        private Classinfo classinfo;
        
        
        public Studentinfo() {
            super();
            // TODO Auto-generated constructor stub
        }
        
        public Studentinfo(String studentName, int studentAge, String studentAddress) {
            super();
            this.studentName = studentName;
            this.studentAge = studentAge;
            this.studentAddress = studentAddress;
        }
    
        public int getStudentId() {
            return studentId;
        }
        public void setStudentId(int studentId) {
            this.studentId = studentId;
        }
        public String getStudentName() {
            return studentName;
        }
        public void setStudentName(String studentName) {
            this.studentName = studentName;
        }
        public int getStudentAge() {
            return studentAge;
        }
        public void setStudentAge(int studentAge) {
            this.studentAge = studentAge;
        }
        public String getStudentAddress() {
            return studentAddress;
        }
        public void setStudentAddress(String studentAddress) {
            this.studentAddress = studentAddress;
        }
        public Classinfo getClassinfo() {
            return classinfo;
        }
        public void setClassinfo(Classinfo classinfo) {
            this.classinfo = classinfo;
        }
        
        
    }

      Studentinfo.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 package="cn.zzsxt.entity">
        <class name="Studentinfo">
            <id name="studentId">
                <generator class="native"></generator>
            </id>
            <property name="studentName"></property>
            <property name="studentAge"></property>
            <property name="studentAddress"></property>
            <!-- 多对一 -->
            <many-to-one name="classinfo" class="Classinfo" column="classId" lazy="false"></many-to-one>
        </class>
    </hibernate-mapping>    

      

      TestManyToOneSave:

    package cn.zzsxt.test;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    
    import cn.zzsxt.entity.Classinfo;
    import cn.zzsxt.entity.Studentinfo;
    import cn.zzsxt.utils.HibernateUtil;
    
    public class TestManyToOneSave {
        /**
         * 新建一个班级:Java01,添加两个学生zhangsan和lisi,并将这两个学生添加到Java01班级中
         * @param args
         */
        public static void main(String[] args) {
            Session session = HibernateUtil.getSession();
            Transaction tx = session.beginTransaction();
            //新建班级Java01
            Classinfo classinfo = new Classinfo();
            classinfo.setClassName("Java01");
            //新建两个学生zhangsan和lisi
            Studentinfo stu1 = new Studentinfo("zhangsan",20,"郑州");
            Studentinfo stu2 = new Studentinfo("lisi",22,"北京");
            //维护班级和学生之间的关系:单向多对一(从多方维护关联关系):为学生指定班级
            stu1.setClassinfo(classinfo);
            stu2.setClassinfo(classinfo);
            //保存班级和学生
            session.save(classinfo);
            session.save(stu1);
            session.save(stu2);
            tx.commit();
            session.close();
            
        }
    }

      TestManyToOneSelect:

    package cn.zzsxt.test;
    
    import org.hibernate.Session;
    
    import cn.zzsxt.entity.Classinfo;
    import cn.zzsxt.entity.Studentinfo;
    import cn.zzsxt.utils.HibernateUtil;
    
    public class TestManyToOneSelect {
        /**
         * 查询编号为1的学生信息及对应的班级信息
         * @param args
         */
        public static void main(String[] args) {
            Session session = HibernateUtil.getSession();
            Studentinfo student = session.get(Studentinfo.class,1);
            System.out.println(student.getStudentName()+"---"+student.getStudentAge());
            //获取学生对应的班级信息
            Classinfo classinfo = student.getClassinfo();
            System.out.println("班级名称:"+classinfo.getClassName());
            session.close();
            
        }
    }

     2.单向一对多:

      Dept:

    package cn.zzsxt.entity2;
    
    import java.util.HashSet;
    import java.util.Set;
    
    public class Dept {
        private int deptId;
        private String deptName;
        //在一方添加一个包含多方的集合
        private Set<Employee> emps = new HashSet<Employee>();
        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;
        }
        
    }

      Dept.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 package="cn.zzsxt.entity2">
        <class name="Dept">
            <id name="deptId">
                <generator class="native"></generator>
            </id>
            <property name="deptName"></property>
            <!-- 
                name="包含多方的集合名称"
             -->
            <set name="emps">
                <!-- column="外键名称" -->
                <key column="deptId"></key>
                <!-- 一对多 class="集合中元素的类型(多方的类型)" -->
                <one-to-many class="Employee"/>
            </set>
        </class>
    </hibernate-mapping>    

      Employee:

    package cn.zzsxt.entity2;
    
    public class Employee {
        private int empId;
        private String empName;
        
        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;
        }
        
    }

      Employee.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 package="cn.zzsxt.entity2">
        <class name="Employee">
            <id name="empId">
                <generator class="native"></generator>
            </id>
            <property name="empName"></property>
        </class>
    </hibernate-mapping>    

      TestOneToManySave:

    package cn.zzsxt.test;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    
    import cn.zzsxt.entity2.Dept;
    import cn.zzsxt.entity2.Employee;
    import cn.zzsxt.utils.HibernateUtil;
    
    public class TestOneToManySave {
        /**
         * 添加一个部门:开发部
         * 添加两个员工:小三和小四,并且将这两个员工分配到开发部
         * @param args
         * 推荐从多方维护关系:
         * 1.生产的SQL语句数量少,执行效率较高。
         * 2.可以避免因外键不能为NULL带来的异常。
         */
        public static void main(String[] args) {
            Session session = HibernateUtil.getSession();
            Transaction tx = session.beginTransaction();
            //创建开发部
            Dept dept = new Dept();
            dept.setDeptName("开发部2");
            //创建两个员工
            Employee emp1 = new Employee();
            emp1.setEmpName("小三2");
            Employee emp2 = new Employee();
            emp2.setEmpName("小四2");
            //单项一对多(只能在一方维护关联关系):为部门添加员工
            dept.getEmps().add(emp1);
            dept.getEmps().add(emp2);
            //保存部门和员工
            session.save(dept);
            session.save(emp1);
            session.save(emp2);
            tx.commit();
            session.close();
            
        }
    }

    3.双向一对多,控制反转,级联:

      City:

    package cn.zzsxt.entity3;
    
    public class City {
        private int cityId;
        private String cityName;
        //多方添加一个和一方关联的实体对象
        private Province province;
        public int getCityId() {
            return cityId;
        }
        public void setCityId(int cityId) {
            this.cityId = cityId;
        }
        public String getCityName() {
            return cityName;
        }
        public void setCityName(String cityName) {
            this.cityName = cityName;
        }
        public Province getProvince() {
            return province;
        }
        public void setProvince(Province province) {
            this.province = province;
        }
        
    }

      City.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 package="cn.zzsxt.entity3">
        <class name="City">
            <id name="cityId">
                <generator class="native"></generator>
            </id>
            <property name="cityName"></property>
            <!-- 
                many-to-one :多对一 
                cascade:级联(存在关联的数据表,一份随另外关联一方做相同的操作)
                    delete:级联删除
                    save-update:级联新增或修改
                    all:所有操作都级联
                    none:不级联
            -->
            <many-to-one name="province" class="Province" column="provinceId" cascade="save-update" ></many-to-one>
        </class>
    </hibernate-mapping>    

      Province:

    package cn.zzsxt.entity3;
    
    import java.util.HashSet;
    import java.util.Set;
    
    public class Province {
        private int provinceId;
        private String provinceName;
        //一份添加一个包含多方的set集合
        private Set<City> cities = new HashSet<City>();
        public int getProvinceId() {
            return provinceId;
        }
        public void setProvinceId(int provinceId) {
            this.provinceId = provinceId;
        }
        public String getProvinceName() {
            return provinceName;
        }
        public void setProvinceName(String provinceName) {
            this.provinceName = provinceName;
        }
        public Set<City> getCities() {
            return cities;
        }
        public void setCities(Set<City> cities) {
            this.cities = cities;
        }
        
    }

      Province.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 package="cn.zzsxt.entity3">
        <class name="Province">
            <id name="provinceId">
                <generator class="native"></generator>
            </id>
            <property name="provinceName"></property>
            <!-- 
                name="包含多方的集合名称"
                cascade="save-update|delete|all|none" 级联
                inverse="true|false"
                inverse代表关系维护的控制权是否反转,如果inverse值为true代表将关系维护的控制权交与对方
             -->
            <set name="cities" cascade="all" inverse="true">
                <!-- column="外键名称" -->
                <key column="provinceId"></key>
                <!-- 一对多 class="集合中元素的类型(多方的类型)" -->
                <one-to-many class="City"/>
            </set>
        </class>
    </hibernate-mapping>    

      TestOneToMany:

    package cn.zzsxt.test;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    
    import cn.zzsxt.entity2.Dept;
    import cn.zzsxt.entity2.Employee;
    import cn.zzsxt.entity3.City;
    import cn.zzsxt.entity3.Province;
    import cn.zzsxt.utils.HibernateUtil;
    
    public class TestOneToMany {
        /**
         * 添加一个省份:河南省
         * 添加一个城市:郑州市
         * 将郑州市添加到河南省中
         */
        public static void main(String[] args) {
            Session session = HibernateUtil.getSession();
            Transaction tx = session.beginTransaction();
            //创建省份
            Province province = new Province();
            province.setProvinceName("河南省");
            //创建城市
            City city = new City();
            city.setCityName("郑州市");
            //从一份维护关系:为省份添加城市;从多方维护关系:为城市设置省份
            city.setProvince(province);
            session.save(province);
            session.save(city);
            tx.commit();
            session.close();
            
        }
    }

      TestInverse:

    package cn.zzsxt.test;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    
    import cn.zzsxt.entity3.City;
    import cn.zzsxt.entity3.Province;
    import cn.zzsxt.utils.HibernateUtil;
    /**
     * inverse="true":代表将关系维护的控制权交与对方(多方)进行维护,自身无法维护关联关系
     * @author Think
     *
     */
    public class TestInverse {
        public static void main(String[] args) {
            Session session = HibernateUtil.getSession();
            Transaction tx = session.beginTransaction();
            //创建一个河北省
            Province province = new Province();
            province.setProvinceName("山东省2");
            //创建一个城市
            City city = new City();
            city.setCityName("济南2");
            City city2 = new City();
            city2.setCityName("菏泽2");
            //为省份添加城市
            province.getCities().add(city);
            province.getCities().add(city2);
            //通过省份级联城市
            session.save(province);
            tx.commit();
            session.close();
        
            
        }
    }

      TestCascade:

    package cn.zzsxt.test;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    
    import cn.zzsxt.entity3.City;
    import cn.zzsxt.entity3.Province;
    import cn.zzsxt.utils.HibernateUtil;
    
    public class TestCascade {
        public static void main(String[] args) {
            Session session = HibernateUtil.getSession();
            Transaction tx = session.beginTransaction();
            //创建一个河北省
            Province province = new Province();
            province.setProvinceName("山东省");
            //创建一个城市
            City city = new City();
            city.setCityName("济南");
            City city2 = new City();
            city2.setCityName("菏泽");
            //为省份添加城市
            province.getCities().add(city);
            province.getCities().add(city2);
            //通过省份级联城市
            session.save(province);
            tx.commit();
            session.close();
        
            
        }
    }

      TestCascade2:

    package cn.zzsxt.test;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    
    import cn.zzsxt.entity3.City;
    import cn.zzsxt.entity3.Province;
    import cn.zzsxt.utils.HibernateUtil;
    
    public class TestCascade2 {
        public static void main(String[] args) {
            Session session = HibernateUtil.getSession();
            Transaction tx = session.beginTransaction();
            //创建一个河北省
            Province province = new Province();
            province.setProvinceName("河北省");
            //创建一个城市
            City city = new City();
            city.setCityName("石家庄");
            //为城市设置省份
            city.setProvince(province);
            //使用级联新增城市的同时新增省份
            session.save(city);
            tx.commit();
            session.close();
        
            
        }
    }

    4.一对一主键关联:

      IdCard:

    package cn.zzsxt.entity4;
    
    public class IdCard {
        private int id;
        private String cardNo;//身份证号;
        private Person person;//关联的实体对象
        
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getCardNo() {
            return cardNo;
        }
        public void setCardNo(String cardNo) {
            this.cardNo = cardNo;
        }
        public Person getPerson() {
            return person;
        }
        public void setPerson(Person person) {
            this.person = person;
        }
        
    }

      IdCard.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 package="cn.zzsxt.entity4">
        <class name="IdCard">
            <id name="id">
                <!-- foreign:主键生产策略,该主键的值来源"外部"-->
                <generator class="foreign">
                    <!-- 利用property属性指定主键来源于person中的主键 -->
                    <param name="property">person</param>
                </generator>
            </id>
            <property name="cardNo"></property>
            <!--
             one-to-one:一对一 
                 name属性:关联对象的名称
                 class属性:关联对象的类型
                 cascade:级联
                 constrained="true|false":可选属性. 代表是否是约束属性.
                    配置在这里,代表当前属性为约束属性,一定在这个属性对应的表中有
                    数据与本表数据对应.
                 
            -->
            <one-to-one name="person" class="Person" constrained="true"></one-to-one>
        </class>
    </hibernate-mapping>    

      Person:

    package cn.zzsxt.entity4;
    
    public class Person {
        private int id;
        private String name;
        private IdCard idCard;//关联的实体对象
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public IdCard getIdCard() {
            return idCard;
        }
        public void setIdCard(IdCard idCard) {
            this.idCard = idCard;
        }
        
    }

      Person.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 package="cn.zzsxt.entity4">
        <class name="Person">
            <id name="id">
                <generator class="native"></generator>
            </id>
            <property name="name"></property>
            <!--
             one-to-one:一对一 
                 name属性:关联对象的名称
                 class属性:关联对象的类型
                 cascade:级联
                 constrained="true|false":可选属性. 代表是否是约束属性.
                    配置在这里,代表当前属性为约束属性,一定在这个属性对应的表中有
                    数据与本表数据对应.
                 
            -->
            <one-to-one name="idCard" class="IdCard" cascade="save-update"></one-to-one>
        </class>
    </hibernate-mapping>    

      TestOneToOne:

    package cn.zzsxt.test2;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    
    import cn.zzsxt.entity4.IdCard;
    import cn.zzsxt.entity4.Person;
    import cn.zzsxt.utils.HibernateUtil;
    
    public class TestOneToOne {
        public static void main(String[] args) {
            Session session =HibernateUtil.getSession();
            Transaction tx = session.beginTransaction();
            Person person = new Person();
            person.setName("zhangsan");
            IdCard idCard = new IdCard();
            idCard.setCardNo("412722199001011234");
            //为人设置身份证
            person.setIdCard(idCard);
            //为身份证指定人
            idCard.setPerson(person);
            //通过级联添加人和身份证
            session.save(person);
            tx.commit();
            session.close();
            
         }
    }
     

    5.一对唯一外键关联:

      IdCard2:

    package cn.zzsxt.entity5;
    
    public class IdCard2 {
        private int id;
        private String cardNo;//身份证号;
        private Person2 person2;//关联的实体对象
        
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getCardNo() {
            return cardNo;
        }
        public void setCardNo(String cardNo) {
            this.cardNo = cardNo;
        }
        public Person2 getPerson2() {
            return person2;
        }
        public void setPerson2(Person2 person2) {
            this.person2 = person2;
        }
        
        
    }

      Idcard2.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 package="cn.zzsxt.entity5">
        <class name="IdCard2">
            <id name="id">
                <generator class="native"></generator>
            </id>
            <property name="cardNo"></property>
            <!-- 多对一 -->
            <many-to-one name="person2" class="Person2" column="pid" unique="true"></many-to-one>
        </class>
    </hibernate-mapping>    

      Person2:

    package cn.zzsxt.entity5;
    
    public class Person2 {
        private int id;
        private String name;
        private IdCard2 idCard2;//关联的实体对象
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public IdCard2 getIdCard2() {
            return idCard2;
        }
        public void setIdCard2(IdCard2 idCard2) {
            this.idCard2 = idCard2;
        }
    
    }

      Person2.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 package="cn.zzsxt.entity5">
        <class name="Person2">
            <id name="id">
                <generator class="native"></generator>
            </id>
            <property name="name"></property>
            <!--
             one-to-one:一对一 
                 name属性:关联对象的名称
                 class属性:关联对象的类型
                 cascade:级联
                 constrained="true|false":可选属性. 代表是否是约束属性.
                    配置在这里,代表当前属性为约束属性,一定在这个属性对应的表中有
                    数据与本表数据对应.
                 
            -->
            <one-to-one name="idCard2" class="IdCard2" cascade="save-update"></one-to-one>
        </class>
    </hibernate-mapping>    

      TestOneToOne2:

    package cn.zzsxt.test2;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    
    import cn.zzsxt.entity5.IdCard2;
    import cn.zzsxt.entity5.Person2;
    import cn.zzsxt.utils.HibernateUtil;
    
    public class TestOneToOne2 {
        public static void main(String[] args) {
            Session session =HibernateUtil.getSession();
            Transaction tx = session.beginTransaction();
            Person2 person = new Person2();
            person.setName("zhangsan");
            IdCard2 idCard = new IdCard2();
            idCard.setCardNo("412722199001011234");
            //为人设置身份证
            person.setIdCard2(idCard);
            //为身份证指定人
            idCard.setPerson2(person);
            //通过级联添加人和身份证
            session.save(person);
            tx.commit();
            session.close();
            
         }
    }
     

    6.多对多双向关联:

      Emp:

    package cn.zzsxt.entity6;
    
    import java.util.HashSet;
    import java.util.Set;
    
    public class Emp {
        private int empId;
        private String empName;
        private Set<Project> projects = new HashSet<Project>();
        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 Set<Project> getProjects() {
            return projects;
        }
        public void setProjects(Set<Project> projects) {
            this.projects = projects;
        }
        
    }  

      Emp.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 package="cn.zzsxt.entity6">
        <class name="Emp" table="tbl_emp">
            <id name="empId">
                <generator class="native"></generator>
            </id>
            <property name="empName"></property>
            <!-- 
                table="中间表的表名"
             -->
            <set name="projects" table="tbl_emp_project" cascade="all">
                <!-- column:中间表中与Emp对应的外键名称 -->
                <key column="empId"></key>
                <!--
                    many-to-many:多对多 
                    class="集合中的元素类型"
                    column="中间表中与Project对应的外键名称"
                -->
                <many-to-many class="Project" column="projectId"></many-to-many>
            </set>
        </class>
    </hibernate-mapping>    

      project:

    package cn.zzsxt.entity6;
    
    import java.util.HashSet;
    import java.util.Set;
    
    public class Project {
        private int projectId;
        private String projectName;
        private Set<Emp> emps = new HashSet<Emp>();
        
        public int getProjectId() {
            return projectId;
        }
        public void setProjectId(int projectId) {
            this.projectId = projectId;
        }
        public String getProjectName() {
            return projectName;
        }
        public void setProjectName(String projectName) {
            this.projectName = projectName;
        }
        public Set<Emp> getEmps() {
            return emps;
        }
        public void setEmps(Set<Emp> emps) {
            this.emps = emps;
        }
        
    }

      Project.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 package="cn.zzsxt.entity6">
        <class name="Project" table="tbl_project">
            <id name="projectId">
                <generator class="native"></generator>
            </id>
            <property name="projectName"></property>
            <!-- 
                table="中间表的表名"
             -->
            <set name="emps" table="tbl_emp_project" inverse="true">
                <!-- column:中间表中与Project对应的外键名称 -->
                <key column="projectId"></key>
                <!--
                    many-to-many:多对多 
                    class="集合中的元素类型"
                    column="中间表中与Emp对应的外键名称"
                -->
                <many-to-many class="Emp" column="empId"></many-to-many>
            </set>
        </class>
    </hibernate-mapping>    

      TestManyToMany:

    package cn.zzsxt.test2;
     
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    
    import cn.zzsxt.entity6.Emp;
    import cn.zzsxt.entity6.Project;
    import cn.zzsxt.utils.HibernateUtil;
    /**
     * 
     * 添加两个员工:zhangsan和lisi
     * 添加两个项目:OA项目和CRM项目
     * 将zhangsan和lisi分配到OA项目组
     * 将lisi分配到CRM项目组
     * @author Think
     *
     */
    public class TestManyToMany {
        public static void main(String[] args) {
            Session session =HibernateUtil.getSession();
            Transaction tx = session.beginTransaction();
            //创建两个员工
            Emp emp1 = new Emp();
            emp1.setEmpName("张三");
            Emp emp2 = new Emp();
            emp2.setEmpName("李四");
            //创建两个项目
            Project project1 = new Project();
            project1.setProjectName("OA项目");
            Project project2 = new Project();
            project2.setProjectName("CRM项目");
            //关系维护的控制权在emp方,为员工添加项目
            emp1.getProjects().add(project1);//为张三分配OA项目
            emp2.getProjects().add(project1);//为李四分配OA项目
            emp2.getProjects().add(project2);//为李四分配CRM项目
            //保存员工和项目(级联)
            session.save(emp1);
            session.save(emp2);
            tx.commit();
            session.close();
            
         }
    }
     

      

  • 相关阅读:
    单元测试小示例
    分布式版本控制系统Git的安装与使用
    第一次作业:准备
    结对项目四则运算 “软件”之升级版
    个人项目 — 小学四则运算 “软件”之初版
    生命力
    .net 的前景
    力求简洁,应对变化
    现代软件工程 第一章 【概论】练习与讨论 第6题 邓杰
    现代软件工程 第一章 【概论】练习与讨论 第2题 邓杰
  • 原文地址:https://www.cnblogs.com/kuangzhisen/p/7384313.html
Copyright © 2011-2022 走看看