您的位置:首页 > 其它

hibernate多对一关联映射

2011-11-21 09:50 316 查看
hibernate多对一关联映射
关联映射,就是将关联关系映射到数据库中,所谓的关联关系在对象模型中就是一个或多个引用

 

多对一关联映射原理:在多的一端加入一个外键,指向一的一端

在多的一端采用如下标签映射:

         <many-to-onename="group" column="groupid"/>

        

掌握级联的含义?

         *级联是对象之间的连锁操作,它只影响添加、删除和修改        

 

下面就以员工和部门的关系来进行说明

Dept.java

package org.xiaolong.entity;

 

public class Dept {

 

       private Integer deptno;

       private String dname;

    //省略getter和setter方法

}

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
        
<hibernate-mapping package="org.xiaolong.entity">
    <class name="Dept" table="dept" schema="svse">
        <id name="deptno" type="int">
            <generator class="native"></generator>
        </id>
        <property name="dname" length="50" type="string"></property>
    </class>
</hibernate-mapping>

Dept.hbm.xml
Employee.java

package org.xiaolong.entity;
 
public class Employee {
 
       private Integer empno;
       private String ename;
       private Dept dept;
       //省略getter和setter方法

}

Employee.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
        
<hibernate-mapping package="org.xiaolong.entity">
    <class name="Employee" table="employee" schema="ADMIN" select-before-update="true">
        <id name="empno"  type="int">
            <generator class="native"></generator>
        </id>
        <property name="ename" length="50" type="string"></property>
       
        <!-- 映射部门(员工与部门是多对一的关系) -->
        <many-to-one name="dept" column="deptno"
lazy="false"></many-to-one>
    </class>
</hibernate-mapping>

IEmployeeDAO.java

package org.xiaolong.dao;

 

import java.util.List;

 

import org.xiaolong.entity.Dept;

import org.xiaolong.entity.Employee;

 

public interface IEmployeeDAO {

 

         public void addDept(Dept dept);

        

         public void addEmployee(Employee employee);

        

         public void updateEmployee(Employee employee);

        

         public void deleteEmployee(Integer empno);

        

         public Employee getEmployeeById(Integer empno);

        

         public List<Employee> getAllUserInfo();

        

         public List<Employee> getUserInfo(String ename);

        

         public Employee getUserInfoByName(String ename);

}

BaseDAO.java

package org.xiaolong.dao.impl;

 

import org.hibernate.Session;

import org.xiaolong.util.HibernateUtil;

 

public class BaseDAO {

 

         public Session getSession(){

                   return HibernateUtil.getSession();

         }

        

        

         public void closeSession(){

                   HibernateUtil.closeSession();

         }

}

EmployeeDAOImpl.java

package org.xiaolong.dao.impl;

 

import java.util.List;

 

import org.apache.log4j.Logger;

import org.hibernate.HibernateException;

import org.hibernate.Session;

import org.hibernate.Transaction;

import org.xiaolong.dao.IEmployeeDAO;

import org.xiaolong.entity.Dept;

import org.xiaolong.entity.Employee;

 

public class EmployeeDAOImpl extends BaseDAO implements IEmployeeDAO {

 

         private Logger logger = Logger.getLogger(EmployeeDAOImpl.class);

        

         @Override

         public void addDept(Dept dept) {

                   logger.info("add dept start........");

                   Transaction tx = null;

                   try {

                            Session session = this.getSession();

                            tx = session.beginTransaction();

                            session.save(dept);

                            //提交事务

                            tx.commit();

                            logger.info("add dept success.......");

                   } catch (HibernateException e) {

                            if (tx != null) {

                                     tx.rollback();

                            }

                            e.printStackTrace();

                            logger.info("add dept failure.......");

                            throw e;

                   } finally {

                            this.closeSession();              

                   }

                   logger.info("add dept end........");

         }

        

         //添加员工

         public void addEmployee(Employee employee) {

                   logger.info("add employee start........");

                   Transaction tx = null;

                   try {

                            Session session = this.getSession();

                            tx = session.beginTransaction();

                            session.save(employee);

                            //提交事务

                            tx.commit();

                            logger.info("add employee success.......");

                   } catch (HibernateException e) {

                            if (tx != null) {

                                     tx.rollback();

                            }

                            e.printStackTrace();

                            logger.info("add employee failure.......");

                            throw e;

                   } finally {

                            this.closeSession();              

                   }

                   logger.info("add employee end........");

         }

 

         public void deleteEmployee(Integer empno) {

                  

         }

 

         public List<Employee> getAllUserInfo() {

                   return null;

         }

 

         public Employee getEmployeeById(Integer empno) {

                   logger.info("get employee by id start........");

                   Employee employee = null;

                   try {

                            Session session = this.getSession();

                            employee = (Employee)session.get(Employee.class, empno);

                            //employee = (Employee)session.load(Employee.class, empno);

                   } catch (HibernateException e) {

                            e.printStackTrace();

                            logger.info("get employee by id failure.......");

                            throw e;

                   } finally {

                            this.closeSession();              

                   }

                   return employee;

         }

 

         public List<Employee> getUserInfo(String ename) {

                   return null;

         }

 

         public Employee getUserInfoByName(String ename) {

                   return null;

         }

 

         public void updateEmployee(Employee employee) {

 

         }

 

 

}

编写单元测试类EmployeeDAOTest.java

public class EmployeeDAOTest {
 
       private static IEmployeeDAO dao =null;
      
       @BeforeClass
       public static void setUpBeforeClass()
throws
Exception {
              dao = new EmployeeDAOImpl();
       }
       @Test
       public void addEmployee(){
              Dept dept = new Dept();
              dept.setDname("销售部");
             
              Employee emp = new Employee();
              emp.setEname("张三");
              emp.setDept(dept);
             
              Employee emp2 = new Employee();
              emp2.setEname("张三");
              emp2.setDept(dept);
              //在清理缓存是发生错误TransientObjectException
              //由于部门实体处理临时状态,没有被session管理,数据库中没有相应的记录
              //而员工实体处于持久状态,在清理缓存的时候找不到Dept对象
              //结论:Persistent状态的对象不能引用Transient状态的对象
              dao.addEmployee(emp);
              dao.addEmployee(emp2);
       }
      
       @Test
       public void addEmployee1(){
              Dept dept = new Dept();
              dept.setDname("销售部");
              dao.addDept(dept);
             
              Employee emp = new Employee();
              emp.setEname("张三");
              emp.setDept(dept);
             
             
              Employee emp2 = new Employee();
              emp2.setEname("张三");
              emp2.setDept(dept);
              //可以正确保存
              //因为Dept和Employee都是持久状态的对象
              //Hibernate在清理缓存的时候能找到关联的对象
              dao.addEmployee(emp);
              dao.addEmployee(emp2);
             
       }
      
       @Test
       public void addEmployee2(){
              Dept dept = new Dept();
              dept.setDname("策划部");
              dao.addDept(dept);
             
              Employee emp = new Employee();
              emp.setEname("三毛");
              emp.setDept(dept);
             
             
              Employee emp2 = new Employee();
              emp2.setEname("小龙");
              emp2.setDept(dept);
              //可以正确保存,因为此处使用了级联特性
              //Hibernate会首先保存与Employee关联的对象Dept
              dao.addEmployee(emp);
              dao.addEmployee(emp2);
             
       }
      
       @Test
       public void loadEmployee(){
              Employee employee = dao.getEmployeeById(2);
              System.out.println(employee.getEname());
              System.out.println(employee.getDept().getDname());
       }
      
      
}

 

注意:在多对一关联映射中,采用级联删除操作是有问题的,如果删除员工,同时把员工所在部门删掉啦,而其他在此部门的员工怎么办。。。。。。

而在一对多种还是符合逻辑的!

 

 

 

 

 

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息