【学习笔记】Hibernate关联映射(Y2-1-6)
Hibernate关联映射
关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用。
1.单向多对一关联
准备数据库
部门表和员工表
其中部门表有两列 部门编号和名称
员工表有三列 员工ID 名称 和对应的部门id
部门和员工是一个1:N的关系(一个部门有多个员工 一个员工属于一个部门)
Hibernate 小配置文件
<class name="Emp" table="EMP">
<id name="empId" type="java.lang.Integer">
<!--主键生成策略-->
<generator class="native"/>
</id>
<property name="empName" type="string"/> <!--置入一个Dept对象: 多对一-->
<many-to-one name="dept" class="Dept" column="deptNo"></many-to-one>
</class>
在员工EMP的小配置文件中加入many-to-one标签
name属性是EMP实体类中的存放部门的集合的名称
实体类代码如下
然后就配置完了((
书写测试类
Session session;
Transaction tx; @Before
public void myBefore(){
session=HibernateUtil.currentSession();
tx=session.beginTransaction();
} @After
public void myAfter(){
tx.commit();
HibernateUtil.closeSession();
} //修改编号为22的员工所属的部门
@Test
public void updateEmpToOtherDept(){
Emp emp = session.load(Emp.class, 22);
Dept dept=session.load(Dept.class,28);//上下文跟踪到
emp.setDept(dept);
session.saveOrUpdate(emp);
} //2.按照指定的部门对象28,查询相关的Emp对象
@Test
public void selectEmpsByDeptId(){
String hql="from Emp where dept.deptNo=28";
Query query = session.createQuery(hql);
List<Emp> list = query.list();
for (Emp emp:list) {
System.out.println(emp.getEmpName());
}
} //输出指定的emps集合中的所有emp对象及其所关联的部门对象的信息
@Test
public void selectEmpInfo(){
String hql="from Emp";
Query query = session.createQuery(hql);
List<Emp> list = query.list();
for (Emp emp:list) {
System.out.println(emp.getEmpName()+"\t"+emp.getDept().getDeptName());
}
}
2.双向一对多关联
依然是我们的部门表DEPT和员工表EMP
我们就不做截图了
现在实体类中
Dept部门中保存着一个员工的集合
Emp员工中也存放着一个Dept对象 关联着的是对应的部门
部门的实体类如下
Hibernate小配置文件
<class name="Dept" table="DEPT">
<id name="deptNo" type="java.lang.Integer">
<!--主键生成策略-->
<generator class="native"/>
</id>
<property name="deptName" type="string"/> <!--一对多配置 一个部门有N个员工-->
<set name="emps" cascade="save-update" inverse="true">
<key column="deptNo"></key><!--多的一方的外键-->
<one-to-many class="Emp"/>
</set>
</class>
在关联员工的Set集合时 使用Set标签
name属性对应实体类中的集合名称
key标签是一对多中多的一方的外键 对应的列是部门的编号
one-to-many表示一对多 关联的实体类是Emp员工类
Set标签的其他属性说明
1.cascade属性
当几个对象需要级练操作的时候可以使用该属性
适用场景:当小配置需要反馈对象间关系
2.inverse属性指定了关联关系中的方向
1.inverse设置为false 则为主动方,由主动方负责维护关联关系 ,默认是false
2.inverse设置为true,不负责维护关联关系
//inverse属性建议设置为true
//在建立两个对象的双向关联时,应该同时修改关联两端的对象的相应属性
3.order-by
书写测试类
@Test
public void manyToOneDouble(){
Session session= HibernateUtil.currentSession();
Transaction tx=session.beginTransaction(); Dept dept=new Dept();
dept.setDeptName("17"); Emp emp=new Emp();
emp.setEmpName("天命");
emp.setDept(dept);
//dept.getEmps().add(emp); session.save(dept);
session.save(emp); tx.commit();
HibernateUtil.closeSession();
}
延迟加载
延迟加载(lazy load)是当在真正需要数据时,才执行SQL语句进行查询 避免了无谓的开销
<class name="Dept" table="DEPT" lazy="true/false">
(默认lazy为true)
lazy属性只对load()方法有效 (对get无效)
类级(当前类中)
2.关联级别
<set name="emps" lazy="true/false/extra" lazy="true" cascade="save-update" inverse="true">
<key>
<column name="DEPTNO"></column>
</key>
<......>
</set>
lazy="true/false/extra"
true:延迟加载
false:立即加载
extra:扩展(极其懒惰)
【学习笔记】Hibernate关联映射(Y2-1-6)的更多相关文章
- Hibernate学习笔记-Hibernate关系映射
1. 初识Hibernate——关系映射 http://blog.csdn.net/laner0515/article/details/12905711 2. Hibernate 笔记8 关系映射1( ...
- 1.4(Mybatis学习笔记)关联映射
一.一对一 mybatis处理一对一主要通过<resultMap>中的<association>元素来处理. <association>元素主要使用方方式有两种: ...
- MyBatis:学习笔记(3)——关联查询
MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统, ...
- Hibernate关联映射关系
Hibernate关联映射关系 一.双向一对多关联映射关系:当类与类之间建立了关联,就可以方便的从一个对象导航到另一个或另一组与它关联的对象(一对多双向关联和多对一双向关联是完全一样的) 1.1创建实 ...
- Oracle primary,unique,foreign 区别,Hibernate 关联映射
Oracle primary,unique,foreign 区别 转:http://www.cnblogs.com/henw/archive/2012/08/15/2639510.html NOT N ...
- 第六章 Hibernate关联映射
第六章 hibernate关联映射一.本章知识点分为2部分:1.关联关系:单向多对一关联关系,双向一对多关联关系(含一对多关联关系),多对多关联关系2.延迟加载:类级别加载策略,一对多加载策略,多对一 ...
- 第三章Hibernate关联映射
第三章Hibernate关联映射 一.关联关系 类与类之间最普通的关系就是关联关系,而且关联是有方向的. 以部门和员工为列,一个部门下有多个员工,而一个员工只能属于一个部门,从员工到部门就是多对一关联 ...
- (转)MyBatis框架的学习(五)——一对一关联映射和一对多关联映射
http://blog.csdn.net/yerenyuan_pku/article/details/71894172 在实际开发中我们不可能只是对单表进行操作,必然要操作多表,本文就来讲解多表操作中 ...
- (转)Hibernate关联映射——对象的三种关系
http://blog.csdn.net/yerenyuan_pku/article/details/70148618 Hibernate关联映射——对象的三种关系 Hibernate框架基于ORM设 ...
随机推荐
- 记录linux tty的一次软锁排查2
在复现tty的死锁问题的时候,文洋兄使用了如下的方式: #include <fcntl.h> #include <unistd.h> #include <stdio.h& ...
- python_改变字符串中文本格式?
案例: 某软件的日志文件,其中日期格式为year-moth-day: 2016-04-21 10:50:30 python 2014-05-22 10:50:30 python 2017-06-23 ...
- scrapy_简介页面和详情页面
如何对提取的URL进行限定? 往上找id和class属性值,进行多次层级选择,进行内容限定 如何实现获取主页所有urls,然后交给scrapy下载后并解析详情页面,返回结果?(文章简介页面和文章详细页 ...
- Windows核心编程&进程
1. 进程的定义 说白了进程就是一个正在运行的执行程序,包含内核对象和独立的地址空间,内核对象负责统计和管理进程信息,地址空间包括所有可执行文件或DLL 模块的代码和数据.动态内存分配(线程堆和栈的分 ...
- MySQL如何选择合适的引擎以及引擎的转换。
我们怎么选择合适的引擎?这里简单归纳一句话:"除非需要用到某些InnoDB不具备的特性,并且没有其他办法可以替代,否则都应该优先选择InnoDB引擎." 除非万不得已,否则不建议混 ...
- linkin大话数据结构--Google commons工具类
package tz.web.dao.bean; import java.util.Arrays; import java.util.Collection; import java.util.List ...
- 基于百度地图SDK和Elasticsearch GEO查询的地理围栏分析系统(3)-前端实现
转载自:http://www.cnblogs.com/Auyuer/p/8086975.html MoonLight可视化订单需求区域分析系统实现功能: 在现实生活中,计算机和互联网迅速发展,人们越来 ...
- 前端自动化测试神器-Katalon的基础用法
前言 最近由于在工作中需要通过Web端的功能进行一次大批量的操作,数据量大概在5000左右,如果手动处理, 完成一条数据的操作用时在20秒左右的话,大概需要4-5个人/天的工作量(假设一天8小时的工作 ...
- CentOS7修改主机名(hostname)
Linux中的hostname在大多数应用中至为重要,例如有些应用强制使用主机名称而不能使用IP地址,如果默认主机名称都为localhost.localdomain 的话那一定会出现问题,而且看起来也 ...
- linux上的组管理
上一次我们谈了CentOS上的用户管理,现在我们再来谈下CentOS上的用户组管理. groupadd创建一个新的组 用法如下: groupadd [选项] groupname 常用选项: -f 强制 ...