zoukankan      html  css  js  c++  java
  • hibernate一对多和多对一配置

    public class Dept {

     

    private int deptId;

    private String deptName;

    // 【一对多】 部门对应的多个员工

    private Set<Employee> emps = new HashSet<Employee>();

     

    public class Employee {

     

    private int empId;

    private String empName;

    private double salary;

    // 【多对一】员工与部门

    private Dept dept;

     

    Dept.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="cn.itcast.b_one2Many">

     

    <class name="Dept" table="t_dept">

    <id name="deptId">

    <generator class="native"></generator>

    </id>

    <property name="deptName" length="20"></property>

     

    <!--

    一对多关联映射配置  (通过部门管理到员工)

    Dept 映射关键点:

    1.  指定 映射的集合属性: "emps"

    2.  集合属性对应的集合表: "t_employee"

    3.  集合表的外键字段   "t_employee. dept_id"

    4.  集合元素的类型

     

     -->

     <set name="emps">   <!-- table="t_employee" -->

       <key column="dept_id"></key>

       <one-to-many class="Employee"/>

     </set>

     

     

    </class>

     

     

    </hibernate-mapping>

     

     

    Employee.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="cn.itcast.b_one2Many">

     

    <class name="Employee" table="t_employee">

    <id name="empId">

    <generator class="native"></generator>

    </id>

    <property name="empName" length="20"></property>

    <property name="salary" type="double"></property>

     

    <!--

    多对一映射配置

    Employee 映射关键点:

    1.  映射的部门属性  :  dept

    2.  映射的部门属性,对应的外键字段: dept_id

    3.  部门的类型

     -->

     <many-to-one name="dept" column="dept_id" class="Dept"></many-to-one>

     

    </class>

     

     

    </hibernate-mapping>

     

    测试

     

    public class App {

     

    private static SessionFactory sf;

    static {

    sf = new Configuration()

    .configure()

    .addClass(Dept.class)   

    .addClass(Employee.class)   // 测试时候使用

    .buildSessionFactory();

    }

     

    // 保存, 部门方 【一的一方法操作】

    @Test

    public void save() {

     

    Session session = sf.openSession();

    session.beginTransaction();

     

    // 部门对象

    Dept dept = new Dept();

    dept.setDeptName("应用开发部");

    // 员工对象

    Employee emp_zs = new Employee();

    emp_zs.setEmpName("张三");

    Employee emp_ls = new Employee();

    emp_ls.setEmpName("李四");

    // 关系

    dept.getEmps().add(emp_zs);

    dept.getEmps().add(emp_ls);

     

    // 保存

    session.save(emp_zs);

    session.save(emp_ls);

    session.save(dept); // 保存部门,部门下所有的员工  

     

    session.getTransaction().commit();

    session.close();

    /*

     *  结果

     *  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=?    维护员工引用的部门的id

    Hibernate: update t_employee set deptId=? where empId=?

     */

    }

    // 【推荐】 保存, 部员方 【多的一方法操作】

    @Test

    public void save2() {

     

    Session session = sf.openSession();

    session.beginTransaction();

     

    // 部门对象

    Dept dept = new Dept();

    dept.setDeptName("综合部");

    // 员工对象

    Employee emp_zs = new Employee();

    emp_zs.setEmpName("张三");

    Employee emp_ls = new Employee();

    emp_ls.setEmpName("李四");

    // 关系

    emp_zs.setDept(dept);

    emp_ls.setDept(dept);

     

     

    // 保存

    session.save(dept); // 先保存一的方法

    session.save(emp_zs);

    session.save(emp_ls);// 再保存多的一方,关系回自动维护(映射配置完)

     

    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 (?, ?, ?)

    少生成2update  sql

     */

    }

     

    }

     

    总结:

      在一对多与多对一的关联关系中,保存数据最好的通过多的一方来维护关系

      这样可以减少update语句的生成,从而提高hibernate的执行效率!

      配置一对多与多对一,这种叫“双向关联”

      只配置一对多,           叫“单项一对多”

      只配置多对一,           叫“单项多对一”

     

    注意:

    配置了哪一方,哪一方才有维护关联关系的权限!

  • 相关阅读:
    设计模式 || 观察者模式
    并发问题的源头—原子性、可见性、有序性。
    设计模式 || 适配器模式
    JAVA线程池的创建与使用
    JVM垃圾收集算法之清除算法
    JVM垃圾收集算法之标记算法
    ajax入门简介
    Junit测试入门
    JVM&G1 GC 学习笔记(一)
    HTTPS学习总结
  • 原文地址:https://www.cnblogs.com/hello-liyb/p/7967956.html
Copyright © 2011-2022 走看看