hiberante 部门与员工案例操作

来源:互联网 发布:java中级工程师面试题 编辑:程序博客网 时间:2024/05/17 18:28

好久没用hibernate了。

今天用起来,呵呵有点冲突惊恐

这是部门的relation:

<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
                            "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
                            "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<hibernate-mapping package="com.oasystem.demo.bean">
    <class name="DepartmentBean" table="department_b">
        <id name="departmentId" column="department_id" type="java.lang.Integer">
            <generator class="native"/>
        </id>
        <property name="departName" column="department_name" type="java.lang.String"  />
        <set name="employeeBeans" cascade="all" inverse="true"  >
         <key column="department_id"></key>
         <one-to-many class="EmployeeBean"/>
        </set>
    </class> 
</hibernate-mapping

这是员工的relation:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!--看出这里和部门的不一制没,这里的这是因为我工具导入的是3.0的 这里手动导入的是3.0以上的。然而这样是不冲突的,但是如果用<!DOCTYPE hibernate-mapping PUBLIC
                            "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
                            "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >的话。many - to -one 是不能是使用

fetch="select" 
             access="property" 
            not-null="true" 
            lazy="false" 的。
--> 
<hibernate-mapping package="com.oasystem.demo.bean">
    <class name="EmployeeBean" table="employeebean_b">
        <id name="employeeId" column="employee_id" type="java.lang.Integer">
            <generator class="native"/>
        </id>
        <property name="employeeName" column="employee_name" type="java.lang.String"  />
        <!--  此时实验的是 many - to -one  多个员工对应单个部门 -->
        <many-to-one name="departmentBean" class="DepartmentBean" column="department_id" insert="false" fetch="select" 
             access="property" 
            not-null="true" 
            lazy="false"   >
        </many-to-one>
    </class>
</hibernate-mapping>

 

以上relation one-many 和many - to -one 这样配置之后,在级联删除操作在控制台生成的sql 打印是:

Hibernate: select this_.department_id as department1_0_, this_.department_name as department2_0_0_ from department_b this_ where this_.department_id=?
Hibernate: select employeebe0_.department_id as department3_1_, employeebe0_.employee_id as employee1_1_, employeebe0_.employee_id as employee1_0_, employeebe0_.employee_name as employee2_1_0_, employeebe0_.department_id as department3_1_0_ from employeebean_b employeebe0_ where employeebe0_.department_id=?
Hibernate: delete from employeebean_b where employee_id=?
Hibernate: delete from department_b where department_id=?

从打印sql来看多的一方,是先删除的。这是因为关系的维护是员工。是用多的一方维护这种级联关系 部门中设置cascade="all" inverse="true" 。

员工及设置立即加载lazy="false" 属性

代码如下:

    public void deleteDepartment(DepartmentBean departmentBean){
     session = HibernateSessionFactory.getSession();
  tr = session.beginTransaction();
  Criteria criteria =  session.createCriteria(DepartmentBean.class);
  criteria.add(Restrictions.eq("departmentId", departmentBean.getDepartmentId()));
  List list = criteria.list();
  System.out.println("  == "+list.size());
  if (list.size() != 0) {
   DepartmentBean bean = (DepartmentBean)list.get(0);
   Set<EmployeeBean> employeeBeans = bean.getEmployeeBeans();
   EmployeeBean bean2 =employeeBeans.iterator().next();
   session.delete(bean);
  }
  tr.commit();
  session.close();
    }

 

     /**删除部门连同部门下的员工也要删除掉**/
     DepartmentBean departmentBeanTest2 = new DepartmentBean();
     departmentBeanTest2.setDepartmentId(6);
     hibernateAdqe.deleteDepartment(departmentBeanTest2);

 

 

 

 

0 0