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>

  • 相关阅读:
    Html.BeginForm())与Ajax.BeginForm()
    MVC5+EF6 (附加分页功能)
    display模版详细介绍
    vs2013创建mvc项目体系找不到指定文件
    MVC2、MVC3、MVC4、MVC5之间的区别 以及Entity Framework 6 Code First using MVC 5官方介绍教程
    windows下android开发环境搭建
    windows下android环境的搭建:完成后添加android其他版本
    免费提供各种编程语言视频教程资料!(福利!)
    AS无法连接手机,5037端口总被占用怎么办?
    Android基于bmob后端云实现数据读取
  • 原文地址:https://www.cnblogs.com/345214483-qq/p/4114688.html
Copyright © 2011-2022 走看看