Hibernate中的关联映射
关联关系
平时开发中,类与类之间最普遍的的关系就是关联关系,而且关联是有方向的。
以部门(Dept)和员工(Employee)为例:一个部门下有多个员工,而一个员工只能属于一个部门。
从Employee到Dept的关联就是 多对一 关联。 这就说明 每个Employee对象只会引用一个Dept对象,因此在Employee类中应该定义一个Dept类型的属性,来引用所关联的Dept对象。
从Dept到Employee的关联就是 一对多 关联。这就说明 每个Dept对象会引用一组Employee对象,因此应该在Employee类中定义一个集合类型的属性,来引用所有关联的Employee对象。
如果仅有从Employee到Dept的关联或者仅有从Dept到Employee的关联,就称为单向关联。
如果同时包含两种关联,就是双向关联。
单向关联
双向关联
配置多对一的关联关系
配置文件中配置 使用'many-to-one'进行配置
private Integer id; private String name; private Integer age; private Integer sex; private Dept dept; //引用所属的部门
映射文件
<many-to-one name="dept" column="dept" class="com.ytzl.demo.entity.Dept" cascade="save-update"></many-to-one>
配置一对多的关联关系
以员工和部门为例 ,从部门到员工的关联就是 一对多的关联
修改类属性
private Integer id; private String name; private Set<Employee> employees = new HashSet<>(); //用来保存员工引用
修改映射文件
<!-- 配置一对多的关联 --> <set name="employees"> <!-- name 对应的属性名 就是集合的名字 --> <key column="dept"></key> <!-- 对应的是 employee表的外键字段名 --> <one-to-many class="com.ytzl.demo.entity.Employee"/> <!-- 关联的类 这里是 员工类 --> </set>
cascade 属性 关联操作
用于指定如何操作与当前对象关联的其他对象
可选值:
inverse属性 反转属性
在hibernate中,'inverse'属性指定了关联关系中的方向。
关联关系中,'inverse=”false”‘的为主动方,由主动方负责维护关联关系。
order-by属性 指定集合内元素的排序顺序
这里以员工和部门为例,部门内的员工要以年龄倒序的顺序排序,就可以通过设置 order-by属性
order-by="age desc"
多对多关联
以 员工和项目为例,一个员工可以参与到多个项目中,每个项目有多个员工的参于
往往多对多映射涉及到第三张表
Project类
private Integer id; private String name; private Set<Employee> employees = new HashSet<>();
配置Project映射类
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name= "com.ytzl.demo.entity.Project" table ="project" dynamic-update="true"> <id name="id" column="p_id" type="java.lang.Integer"> <generator class="increment"></generator> </id> <property name="name" column="p_name" type="java.lang.String"></property> <set name="employees" table="emp_pro_relate" cascade="save-update"> <key column="pro_id"></key> <many-to-many class="com.ytzl.demo.entity.Employee" column="emp_id"></many-to-many> </set> </class> </hibernate-mapping>
Employee类
private Integer id; private String name; private Integer age; private Integer sex; private Dept dept; //引用所属的部门 private Set<Project> projects = new HashSet<>(); //保存项目引用
Employee映射文件
<set name="projects" table="emp_pro_relate" inverse="true"> <key column="emp_id"></key> <many-to-many class="com.ytzl.demo.entity.Project" column="pro_id"></many-to-many> </set>
延迟加载
当hibernate从数据库中加载Dept对象时,如果同时加载所有关联的Employee对象,而我们仅仅需要Dept对象,那么这些关联的对象就白白浪费了许多内存空间,这时就有了延迟加载,如果实际需要用到Employee时再去加载。hibernate使用lazy属性指定延迟加载的查询策略
hibernate允许在对象-关系映射文件中配置加载策略
级别 | 说明 |
---|---|
类级别 | |
一对多关联级别 | |
多对一关联级别 |
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对呐喊教程的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#nhooo.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。