Hibernate关联映射

Hibernate关联映射

关联关系

类与类之间最普遍的关系就是关联关系

  • 单向的关联
    在这里插入图片描述
  • 双向的关联
    在这里插入图片描述

多对一关联关系

  • 配置 Emp 到 Dept 的多对一关联

    • Emp 持久化类
    public class Emp implements Serializable{
        .......
        private Dept dept;
        //省略其他属性及getter、setter访问器
    }
    • Emp.hbm.xml
    <class name="cn.hibernatedemo.entity.Emp" table="`EMP`">
    	......
        <mant-to-one name="dept" column="`DEPTNO`" class="cn.hibernatedemo.entity.Dept"/>
    </class>
  • 关联关系下的持久化操作

一对多关联关系

  • 配置 Dept 到 Emp 的一对多关联

    • Dept 持久化类

      public class Dept implements Serilalizable{
          private Set<Emp> emps = new HashSet<Emp>();
          //省略其他属性及getter、setter访问器
      }
    • Dept.hbm.xml

      <class name="cn.hibernatedemo.entity.Dept" table="`DEPT`">
      	......
          <set name="emps">
          	<key column="`DEPTNO`"></key>
              <one-to-many class="cn.hibernatedemo.entity.Emp"/>
          </set>
      </class>

级联属性(cascade属性)

  • 建立从Dept到Emp的一对多关联

  • 在标签中配置cascade属性

    cascade属性值描述
    none当Session操纵当前对象时,忽略其他关联的对象。它是cascade属性的默认值
    save-update当通过Session的save()、update()及saveOrUpdate()方法来保存或更新当前对象时,级联保存所有关联的新建的瞬时状态的对象,并且级联更新所有关联的游离状态的对象
    merge当通过Session的merge()方法来保存或更新当前对象时,对其关联对象也执行merge()方法
    delete当通过Session的delete()方法删除当前对象时,会级联删除所有关联的对象
    all包含所有的级联行为

< set>元素的inverse属性

inverse属性指定了关联关系中的方向

  • inverse设置为false,则为主动方,由主动方负责维护关联关系,默认是false
  • inverse设置为true,不负责维护关联关系
  • 在建立两个对象的双向关联时,应该同时修改两个关联对象的相关属性
  • 建议inverse设置为true

多对多关联关系

  • 配置Project和Employee的双向多对多关联

    • Project、Employee持久化类

      public class Project implements Serializable{
      	private Integer proid;
          private String proname;
          private Set<Employee> emoloyees = new HashSet<Employee>();
      }
      public class Employee implements Serializable{
          private Integer empid;
          private String empname;
          private Set<Project> prijects = new HashSet<Project>(); 
      }

      中间表

      public class PROEMP implements Serializable{
          private Integer RPROID;
          private Integer REMPID;
      }
    • Project.hbm.xml、Employee.hbm.xml

      <class name="cn.hibernatedemo.entity.Project" table="`PROJECT`">
      	<id name="proid" type="java.lang.Integer">
          	<column name="PROID" precision="6" scale="0"/>
              <generator class="assigned"/>
          </id>
          ......
          <set name="employees" table="PROEMP" cascade="save-update">
          	<key column="RPROID"/>
              <many-to-many class="cn.hibernatedemo.entity.Employee" column="REMPID"/>
          </set>
      </class>
      <class name="cn.hibernatedemo.entity.Employee" table="`EMPLOYEE`">
      	<id name="empid" type="java.lang.Integer">
          	<column name="EMPID" precision="6" scale="0"/>
              <generator class="assigned"/>
          </id>
          ......
          <set name="projects" table="PROEMP">
          	<key column="REMPID"/>
              <many-to-many class="cn.hibernatedemo.entity.Project" column="RpROID"/>
          </set>
      </class>

延迟加载

  • 延迟加载(lazy load懒加载)是在真正需要数据时才执行SQL语句进行查询,避免了无谓的性能开销

  • 延迟加载策略的设置分为

    • 类级别的查新策略
    • 一对多和多对多关联的查询策略
    • 多对一关联的查询策略
  • lazy属性

    • 一对多和多对多关联的查询策略

      lazy属性值加载策略
      true(默认)延迟加载
      false立即加载
      extra增强延迟加载
    • 多对一关联的查询策略

      lazy属性值加载策略
      proxy(默认)延迟加载
      no-proxy无代理延迟加载
      false立即加载

Open Session In View模式

在用户的每一次请求过程始终保持一个Session对象打开着
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值