zoukankan      html  css  js  c++  java
  • 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>

  • 相关阅读:
    JavaScript中字符串处理的一些函数
    JavaScript中的call、apply、bind方法的区别
    JavaScript中的数组与伪数组的区别
    关于字符集和字符编码那些事
    JavaScript的技巧和最佳实践
    Linux下编辑利器vim,vimrc,viminfo的高级用法
    pdo,更高的sql安全性
    Centos下cacti的安装
    nginx中的502错误
    mac下webpagetest搭建
  • 原文地址:https://www.cnblogs.com/345214483-qq/p/4114688.html
Copyright © 2011-2022 走看看