//反转维护
@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
因为Emp的DEPT属性没有赋值(没有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>