首页 > 代码库 > Hibernate反转维护

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>

Hibernate反转维护