Hibernate框架学习-映射关系之一对多与多对一

1.Hibernate环境的搭建步骤:

         ----》 引入jar:hibernate.jar + required + jpa + 驱动包

         ---》hibernate.cfg.xml

         ---》 javabean/*.hbm.xml

         ---》Application  测试


2. 关联映射


需求1:

         部门与员工

                     一个部门有多个员工;       【一对多】

                     多个员工,属于一个部门    【多对一】

需求2:

         项目与开发员工

                   一个项目,有多个开发人员!

                   一个开发人员,参与多个项目!   【多对多】


3.先讲解双向一对多映射【一个部门对应多个员工】

部门的实体类:

public class Dept {

 

   private int deptId;

   private StringdeptName;

   // 【一对多】部门对应的多个员工

   private Set<Employee>emps = new HashSet<Employee>();

员工的实体类

public class Employee {

 

   private int empId;

   private StringempName;

   private double salary;

   // 【多对一】员工与部门
   private Deptdept;



部门 Dept的映射文件

<?xmlversion="1.0"?>

<!DOCTYPEhibernate-mapping PUBLIC

   "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

   "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

 

<hibernate-mappingpackage="cn.itcast.b_one2Many">

  

   <classname="Dept"table="t_dept">

      <idname="deptId">

        <generatorclass="native"></generator>

      </id>

      <propertyname="deptName"length="20"></property>

      <!--

        一对多关联映射配置 (通过部门管理到员工)

        Dept 映射关键点:

        1.  指定映射的集合属性: "emps"

        2.  集合属性对应的集合表: "t_employee"

        3.  集合表的外键字段   "t_employee. dept_id"

        4.  集合元素的类型

       -->

       <setname="emps">  <!-- table="t_employee" -->

          <keycolumn="dept_id"></key>

          <one-to-manyclass="Employee"/>

       </set>

   </class> 

</hibernate-mapping>

员工的配置文件

<?xmlversion="1.0"?>

<!DOCTYPEhibernate-mapping PUBLIC

   "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

   "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mappingpackage="cn.itcast.b_one2Many">

   <classname="Employee"table="t_employee">

      <idname="empId">

        <generatorclass="native"></generator>

      </id>

      <propertyname="empName"length="20"></property>

      <propertyname="salary"type="double"></property>

      <!--

        多对一映射配置

        Employee 映射关键点:

        1.  映射的部门属性 :  dept

        2.  映射的部门属性,对应的外键字段: dept_id,与部门实体类的映射文件中的外键字段要一致

        3.  部门的类型

       -->

       <many-to-onename="dept"column="dept_id"class="Dept"></many-to-one>

   </class>
 
</hibernate-mapping>


测试类

// 保存,部门方【一的一方法操作】

   @Test

   public void save() {

      Session session = sf.openSession();

      session.beginTransaction();

     

      // 部门对象

      Dept dept = new Dept();

      dept.setDeptName("应用开发部");

      // 员工对象

      Employee emp_zs = new Employee();

      emp_zs.setEmpName("张三");

      Employee emp_ls = new Employee();

      emp_ls.setEmpName("李四");

      // 关系

      dept.getEmps().add(emp_zs);

      dept.getEmps().add(emp_ls);

 

      // 保存

      session.save(emp_zs);

      session.save(emp_ls);

      session.save(dept); // 保存部门,部门下所有的员工 

     

      session.getTransaction().commit();

      session.close();


// 【推荐】保存,部员方【多的一方法操作】

   @Test

   public void save2() {

     

      Session session = sf.openSession();

      session.beginTransaction();

     

      // 部门对象

      Dept dept = new Dept();

      dept.setDeptName("综合部");

      // 员工对象

      Employee emp_zs = new Employee();

      emp_zs.setEmpName("张三");

      Employee emp_ls = new Employee();

      emp_ls.setEmpName("李四");

      // 关系

      emp_zs.setDept(dept);

      emp_ls.setDept(dept);

     

     

      // 保存

      session.save(dept); // 先保存一的方法

      session.save(emp_zs);

      session.save(emp_ls);// 再保存多的一方,关系回自动维护(映射配置完)

     

      session.getTransaction().commit();

      session.close();


总结:

  在一对多与多对一的关联关系中,保存数据最好的通过多的一方来维护关系,这样可以减少update语句的生成,从而提高hibernate的执行效率!

        

配置一对多与多对一,这种叫“双向关联”

只配置一对多,           叫“单项一对多”

只配置多对一,           叫“单项多对一”




















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值