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对象打开着