• Hibernate反转维护


      //反转维护

      @Test

      public void test4(){

      Session ses=new Configuration().configure().buildSessionFactory().openSession();

      Dept dept=new Dept();

      dept.setDname("shenpeng");

      dept.setLoc("China");

      dept.getEmps().add(new Emp("sps1", new Timestamp(System.currentTimeMillis()), 666.6).setDept(dept));

      dept.getEmps().add(new Emp("sps2", new Timestamp(System.currentTimeMillis()), 666.6).setDept(dept));

      dept.getEmps().add(new Emp("sps3", new Timestamp(System.currentTimeMillis()), 666.6).setDept(dept));

      ses.getTransaction().begin();

      ses.save(dept);

      ses.getTransaction().commit();

      ses.close();   

      }

    在部门表里添加多个雇员列的时候会产生多一倍的语句:

    Hibernate: insert into EMP (ename, job, mgr, hiredate, sal, comm, DEPTNO, empno) values (?, ?, ?, ?, ?, ?, ?, ?)

    Hibernate: insert into EMP (ename, job, mgr, hiredate, sal, comm, DEPTNO, empno) values (?, ?, ?, ?, ?, ?, ?, ?)

    Hibernate: insert into EMP (ename, job, mgr, hiredate, sal, comm, DEPTNO, empno) values (?, ?, ?, ?, ?, ?, ?, ?)

    Hibernate: update EMP set DEPTNO=? where empno=?

    Hibernate: update EMP set DEPTNO=? where empno=?

    Hibernate: update EMP set DEPTNO=? where empno=?

    首先先在表里添加部门信息,直接再添加员工信息,因为此时还没有部门表的情况,所以在添加完员工信息后再更新员工表里的部门编号为Dept里的NO.

     

    解决方法

    此时可以设置Dept映射文件里的关系为反转(true就是由对方(Emp)自动维护):

      <set name="emps" cascade="save-update" inverse="true">

          <key column="DEPTNO"></key>

          <one-to-many class="cn.jbit.bean.Emp"/>

          </set>

    之后再运行后Hibernate产生的数据库SQL语句:

    Hibernate: insert into EMP (ename, job, mgr, hiredate, sal, comm, DEPTNO, empno) values (?, ?, ?, ?, ?, ?, ?, ?)

    Hibernate: insert into EMP (ename, job, mgr, hiredate, sal, comm, DEPTNO, empno) values (?, ?, ?, ?, ?, ?, ?, ?)

    Hibernate: insert into EMP (ename, job, mgr, hiredate, sal, comm, DEPTNO, empno) values (?, ?, ?, ?, ?, ?, ?, ?)

    此时的SQL语句只有3条插入,没有更新,但是得到的结果却是:

    EMPNO   ENAME          HIREDATE            SAL        DEPTNO

    23        16   sps3 2014/11/6 12:14:59 666.60

    24        17   sps2 2014/11/6 12:14:59 666.60

    25        18   sps1 2014/11/6 12:14:59 666.60

    因为EmpDEPT属性没有赋值(没有DeptNo的值)所以插入数据库的时候没有给DEPTNO值.

    解决方法为:在给dept.getEmps().add( )的时候直接给new Emp().setDept(dept),但是这样还会报错The method add(Emp) in the type Set<Emp> is not applicable for the arguments (void),此时还需要在构造函数里

    dept.getEmps().add(new Emp("sps1", new Timestamp(System.currentTimeMillis()), 666.6).setDept(dept));

    dept.getEmps().add(new Emp("sps2", new Timestamp(System.currentTimeMillis()), 666.6).setDept(dept));

      dept.getEmps().add(new Emp("sps3", new Timestamp(System.currentTimeMillis()), 666.6).setDept(dept));

    此时需要在构造函数里给SetDept的时候返回 Emp;

    public Dept getDept() {

    return dept;

    }

    public Emp setDept(Dept dept) {

    this.dept = dept;

    return this;

    }

    这样就好了.

     

    排序只需在Dept映射文件里加上(inverse="true")

    <set name="emps" cascade="save-update" inverse="true" order-by="empno desc">

          <key column="DEPTNO"></key>

          <one-to-many class="cn.jbit.bean.Emp"/>

          </set>

  • 相关阅读:
    使用 libevent 和 libev 提高网络应用性能
    在PHP中PDO解决中文乱码问题的一些补充
    apache重写规则详解
    Apache的配置
    正则表达式30分钟入门教程
    LVS+keepalived搭建负载均衡
    php判断终端是手机还是电脑访问网站代码
    nginx 502 bad gateway
    算法复习-深度优先遍历和回溯法的关系
    分支限界法和回溯法对比
  • 原文地址:https://www.cnblogs.com/345214483-qq/p/4114688.html
Copyright © 2020-2023  润新知