Hibernate框架Day6Word格式.docx
- 文档编号:16884315
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:10
- 大小:127.24KB
Hibernate框架Day6Word格式.docx
《Hibernate框架Day6Word格式.docx》由会员分享,可在线阅读,更多相关《Hibernate框架Day6Word格式.docx(10页珍藏版)》请在冰豆网上搜索。
都应使用getCurrentSession()
Sessionsession=SessionFactory#openSession();
Sessionsession=SessionFactory#getCurrentSession();
区别:
openSession每一次调用都会获得一个新的Session对象
getCurrentSession所获得的Session只要是一个线程(请求Action---Service---DAO)就是同一个Session
web开发过程中一个请求就是一个线程
原理:
为什么getCurrentSession()可以保证一个请求一个Session底层ThreadLocal
使用:
SessionFactory#getCurrentSession();
1必须在hibernate.cfg.xml中进行额外的配置
<
propertyname="
current_session_context_class"
>
thread<
/property>
2getCurrentSession所获得的session必须运行在事务之中
3getCurrentSession所获得的session事务结束session自动关闭
_延缓提交
概念:
hibernate在进行save()delete()update()操作时不会立即的执行sql语句到数据库中进行操作,
而是在事务提交的时候,一次性的把所有的sql语句同步到数据库中。
好处:
减少和数据库的通信次数,提高程序的运行效率
原理:
jdbcbatchUpdate批处理
注意:
1查询没有延缓提交;
2改变延缓提交的默认策略session.flush();
_自动脏数据检查
脏数据的概念:
对象中的数据与其对应的数据库中的数据不一致,那么对象中存储的数据脏数据。
自动脏数据检查概念:
在事务提交时,如果hibernate发现脏数据时,会自动的更新数据库中的数据
方便
Session内部存储了一份一模一样的对象在事务提交时进行对比,进而发现脏数据
Teachert=session.get(Teacher.class,24);
session内部存储一份数据一样的对象
t.setName("
xiaohei"
mit()hibernate对比tsession内部存储的t是不是发生了改变
发现改变:
update
session的内部怎么存?
通过成员变量存储类型?
集合(ListSetMap)
List有序可重复
Set无序不可重复---Set过滤重复
Mapkey=value便于查找
session内部Map每一次查询时hibernate都会往Map中存储一个一模一样的对象最后在事务提交时进行对比
Mapkey(pk+类型)=value(对象)
1hibernate会以对象最后的状态作为脏数据检查的依据
2session.update()有没有意义?
_hibernate缓存体系
1session的缓存(一级缓存)
当用户发起一次查询时,hibernate首先查找session对象内部,如果没有发现对应数据,发送sql查询数据
如果在session的内部发现了数据,则直接返回,无需发送sql,访问数据库
减少和数据库的交互次数,提高程序的运行效率(空间换时间)
坏处:
缓存过多侵占内存hibernate适合做在线事务处理,不适合做在线事务分析(jdbcpl/sql)
session如何存储操作过的对象?
在SessionMap的成员变量key(pk+类型)value(实体)
1必须明确的使用主键进行查询才可以利用上session的缓存
2query.list()方法与query.iterator()方法区别?
list=query.list();
list.iterator();
..
Iterator<
it=query.iterator();
while(it.hasNext()){
it.next();
}
alist()多上查询时发送一条sql语句iterator发送n+1次sql
blist()利用不了session的缓存iteratlor可以利用session的缓存
3session.save()sessoin.update()时也会把操作过的数据纳入到session的缓存中
4清除session的缓存
session.close();
//mit()/tx.rollback();
session.clear();
session.evict(Objectret);
2Hibernate缓存体系
1一级缓存sesssion的缓存事务级缓存(一个请求一个事务一个线程)
2二级缓存sessionFactory的缓存应用级缓存注意:
默认hibernate不会开启二级缓存
二级缓存开发(介绍)
1注意:
二级缓存hibernate不会开启
2注意:
sessionFactory本质上没有二级缓存的个功能,委托缓存框架(oscacheehcachejboss-cache)
开发步骤
1引入二级缓存框架(oscache)
oscache.jarcommons-logging.jar
hibernate/project/ect/oscache.propertiescopysrc根
2hibernate.cfg.xml中进行配置
use_sencond_level_cachetrue使用二级缓存
provider_class应用oscache
3告知hibernate在二级缓存中缓存什么实体
对应实体的映射文件中进行配置<
cacheusage="
read-only/read-write"
/>
read-only只读
read-write可读可写
_hibernate对象状态
hibernate框架把实体对象划分成了3种状态
1临时状态(瞬态)对象transient
定义:
如果一个实体对象没有对应数据库中的一行数据那么这个对象就是临时状态的对象
获得:
Useruser=newUser();
特点:
没有主键
2持久化状态对象persistence(DAO)
如果一个实体对象在数据库中有对应的一行数据,并且这个对象还纳入了Session缓存那么这个对象就是持久化状态对象
get()querysave()update()session.saveOrUpdate(object);
有主键session缓存
3游离状态(脱管)对象detach(jspServiceAction)
如果一个实体对象在数据库中有对应的一行数据,并且这个对象不纳入session缓存那么这个对象就是游离状态对象
persistenceObject清空缓存session.close();
session.clear()session.evict()
1session.update()方法有意义嘛?
只适用于游离状态对象的更新
2游离状态对象在现有javaEE开发出现的位置
jspActionService
_hibernate中的连接池
Session内部封装了一个Connection对象
获得连接
1Class.forName();
DriverManager.getConnection();
2连接池获得连接
连接池的分类:
1容器连接池(不建议)耦合了web容器:
1不能独立测试2开发差异
2框架连接池(SpringHibernateMyBatis)
hibernate中的连接池开发步骤
1引入c3p0连接池相关jar包c3p0.jar
2hibernate.cfg.xml配置
·
_延迟加载(懒加载)
加载:
hibernate发送sql语句把数据库中的数据查询出来封装对象
立即加载:
hibernate在调用查询方法(get()Query)后,立即执行sql语句把对应的数据库中的数据查询出来。
延迟加载:
hibernate在调用查询方法后,不会立即的执行sql语句把对应的数据库中的数据查询出来,只有当用户明确的需要使用非主键数据时,才会发送sql语句进行查询
延迟加载的分类
1一般属性的延迟加载
一般属性的延迟记载发生在session.load(class,pk)进行的查询操作中
某些只需要使用pk进行操作的代码中,一般属性的延迟加载可以减少内存占用
典型应用场景:
获得主键设置关系的操作
UserDAO{
publicvoiddeleteUser(intid);
HibernateUserDAO{
publicvoiddeleteUser(intid){
//Useruser=session.load(User.class,id);
Useru=newUser();
u.setId(id);
session.delete(u);
注册员工的应用场景
session.get()session.load();
1get立即加载load一般属性延迟加载
2如果传入的主键参数不存在get()可以执行查询但是返回nullload()抛出异常
2关系属性的延迟加载
普遍存在存在延迟加载
一个对象的关系属性会进行延迟加载只有当需要使用关系属性中非id的属性值时,hibernate才会发送sql语句查询关系属性的内容
当只需要使用本对象相关数据时,关系属性进行延迟,减少不别要的内存占用
session.load(Dept.class,1)一般属性关系属性的延迟加载
session.get(Dept.class,2)只有关系属性延迟加载
3延迟加载原理:
Teachert=(Teacher)session.load(Teacher.class,1);
t.getName();
hibernate通过动态字节码技术(早期cglib技术现阶段javassist技术)动态生成的一个Teacher类的子类
hibernate:
HibernateTeacherextendsTeacher{
@Override
publicStringgetName(){
连接数据库发送sql命令查询的代码
returnname;
publicStringgetSalary(){
4延迟加载异常
当延迟加载一个数据时,在事务提交后,在进行加载,就会产生延迟加载异常,主要原因在于事务提交session关闭
解决延迟加载异常:
1扩大事务边界:
把延迟加载的代码放置到事务的内部SpringOpenSessionInView
2fetch迫切连接:
关系属性的延迟加载
innerjoin
leftouterjoin使用重复数据LinkedHashSet过滤
3改变延迟加载的默认策略
不让延迟
1不让一般属性延迟加载
classlazy="
false"
2不让关系属性延迟加载
setlazy="
many-to-onelazy="
3Hibernate继承关系映射
_继承关系映射概念:
þ
实体间的关系2类
1关联关系映射1:
11:
**:
*hasa
2继承关系(了解)isa
_什么情况下会出现实体间的继承关系
TeacherextendsEmployee{
level
}Employee{id,name,salary}
SalesextendsEmployee{
cm
1多个实体出现共有的属性(共性)
2多个实体从属于一个范畴isa
_hibernate对继承关系的处理
1Oextends关键字体现继承
2R应用的是关系型数据库体现的是关联关系(外键)
继承通过合理的见表模拟1共性个性2多态
1一张大表继承体系中所有的属性充当列,区分列
idnamesalarylevelcmtype
1suns1001t
2yw1001s
3qq100t
2每一个类一张表(连接2张表获得子类)
t_employee_super
idnamesalary
1suns100
2yw100
t_teacher_sub
idlevel
11
t_sales_sub
idcm
21
3M一个继承体系一个<
class>
标签
4注册
5API
多态查询
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Hibernate 框架 Day6