hibernate多对一关联映射

来源:互联网 发布:python培训班 马哥 编辑:程序博客网 时间:2024/05/17 22:58

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());

       }

      

      

}

 

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

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

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击