hibernate学习笔记Word文档下载推荐.docx
- 文档编号:5831231
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:36
- 大小:35.21KB
hibernate学习笔记Word文档下载推荐.docx
《hibernate学习笔记Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《hibernate学习笔记Word文档下载推荐.docx(36页珍藏版)》请在冰点文库上搜索。
viii.Hql-sql.g
ix.Sql-gen.g
x.Hibernate通过调用这些生成的解析类完成把HQL语句转为SQL语句的工作
2.1.3HIBERNATE方法的内部实现
略
2.1.4Hibernate能做什么?
2.1.5hibernate应用在哪些方面
2.1.6Hibernate关联关系
1.一对多关联
<
many-to-onename=”customer”column=”CUSTOMER_ID”class=”mypack.Customer”lazy=”false”not-null=”true”/>
此种情况下不会加载关联的临时对象。
级联保存和更新要设置cascade属性
many-to-onename=”customer”column=”CUSTOMER_ID”class=”mypack.Customer”lazy=”false”not-null=”true”cascade=”save-update”/>
2.一对多双向关联
如果不设置inverse=”true”(默认为false)hibernate会两次执行SQL语句,影响性能
Set元素的inverse属性(表明CUSTOMER端的关联只是Order端关联的镜像)
setname=”orders”cascade=”save-update”inverse=”true”inverse=”true”>
keycolumn=”CUSTOMER_ID”/>
one-to-manyclass=”mypack.Order”/>
/set>
3.结论
在映射一对多的双向关联关系时,应该在“ONE”方把<
set>
元素的inverse属性设为true,这可以提高应用的性能
在建立两个对象的双向关联时,应该同时修改关联两端的对象的相应属性
例:
customer.getOrders().add(order)
Order.setCustomer(customer)
4.级联删除
setname=”orders”cascade=”delete”inverse=”true”inverse=”true”>
5.父子关系
设置cascade=”all-delete-orphan”自动删除不再和CUSTOMER对象关联的ORDER对象
setname=”orders”cascade=”all-delete-orphan”inverse=”true”inverse=”true”>
6.映射一对多双向自身关联关系
更为复杂
2.1.7hibernate有哪些特点?
2.1.8接口分类
1.提供访问数据库的操作(如保存,更新,删除和查询对象)的接口包括:
Session,Transaction和Query接口
2.用于配置Hibernate的接口:
Configuration
3.使应用程序拦截Hibernate内部发生的事件,并做出相关的回应。
这些接口包括:
Interceptor,LoadEventListener和SaveEventListener接口
4.用于扩展Hibernate的功能的接口,如UserType,CompositeUserType和IdentifierGenerator
5.Hibernate内部封装了JDBC,JTA(JavaTransactionAPI)和JNDI(JavaNamingandDirectoryInterface).JDBC提供底层的数据访问操作,只要用户提供了相应的JDBC驱动程序,Hibernate可以访问任何一种数据库系统。
JNDI和JTA使Hibernate能够和JAVAEE应用服务器集成。
2.1.8.1.1HIBERNATE的核心接口(有5个)
1.Configuration
配置HIBERNATE,根起动HIBERNATE,创建SessionFactory对象
2.SessionFactory
初始化Hibernate,充当数据存储源的代理,创建Session对象
特点:
✓线程安全的
✓重量级的,一个数据库只需要对应一个SessionFactory在应用程序初始化的时候创建它
✓需要很大的缓存,用来存放定义的SQL语句及映射元数据。
用户可以为SessionFactory配置一个缓存插件,此插件被称为“二级缓存”,该缓存用来存放被工作单元读过的数据,其它工作单元可能会重用这些数据,因此缓存中的数据能够被所有工作单元共享(一个工作单元通常对应一个数据库事务)。
3.Session
也被称作持久化管理器,它提供了持久化相关的操作,负责保存、更新、删除、加载和查询对象
✓不是线程安全的
✓轻量级的
✓每个Session都有自己的缓存,称作“一级缓存”,存放被当前工作单元加载的对象,只能被当前工作单元访问
4.Transaction
管理事务
封装的底层事务接口有:
✓JDBCAPI
✓JTA(JAVATransactionAPI)
✓CORBA(CommonObjectRequetBrokerArchitecture)API
5.Query&
Criteria
执行数据库查询
使用自己的HQL(HibernateQueryLanguage)查询语句
2.1.8.1.2事件处理接口
1.当程序通过Hibernate来加载、保存、更新、删除数据时,会触发Hibernate的拦截器及事件监听器做出相应的处理:
i.事件及事件监听接口
a)HibernateAPI针对每一种事件都有相应的事件监听器
b)例如:
c)加载对象会触发org.hibernate.event.loadEvent事件
d)该事件由org.hibernate.event.LoadEventListener监听器处理
e)保存对象触发org.hibrenate.event.saveEvent事件
f)该事件由org.hibernate.event.SaveEventListener监听器处理
g)Org.hibernate.Interceptor接口
h)应用程序可以定义实现Interceptor接口的类,Interceptor实现类负责响应持久化类的实例被加载、保存、更新、删除的事件
2.1.8.1.3Hibernate映射类型接口
1.PrimitiveType类,映射JAVA基本类型
2.ByteType
3.ShortType
4.IntegerType
5.LongType
6.FloatType
7.DoubleType
8.CharacterType
9.BooleanType
10.DateType,映射Java日期类型
11.BinaryType:
映射Bytes[]类型
2.1.8.1.4可供扩展的接口
定制主键的生成策略
定制本地SQL方言
定制缓存机制
定制JDBC
定制事务管理
定制属性访问策略
创建代理
定制客户化映射类型
2.1.9Hibernate常用的方法
2.1.9.1save()和Persist()
a)相同点是对可以持久化对象
b)与save()方法的区别在于不保证立即给持久化对象的OID赋值
2.1.9.2Load()和get()方法
c)相同点是都能根据给定的OID从数据库中加载一个持久化对象
d)区别在于
如果数据库中不存在与OID对应的记录时,load()方法会抛org.hiberante.ObjectNotFoundException异常,而get()方法返回null
两者采用不同的检索策略
2.1.9.3Update方法
使一个游离对象转变为持久化对象,并且会计划执行一条UPDATE语句
2.1.9.4SaveOrUpdate
同时包含SAVE和UPDATE方法,如果是临时对象,就使用SAVE方法,如果是游离对象则使用UPDATE方法
判断是临时还是游离的方法
JAVA对象的OID取值为NULL
JAVA对象具有的VERSION版本控制属性并且取值为NULL
在映射文件中为<
id>
元素设置了UNSAVED-VALUE属性,并且JAVA对象的OID取值与这个UNSAVE-VALUE属性值匹配
在映射文件中为VERSION版本控制属性设置了UNSAVED-VALUE属性,并且JAVA对象的VERSION版本控制属性的取值与映射文件中UNSAVED-VALUE属性值匹配
为HIBERNATE的INTERCEPTOR提供了自定义的实现,并且INTERCEPTOR实现类的ISUNSAVED()方法返回BOOLEAN.TRUE。
2.1.9.5Merge
把一个游离对象的属性复制到一个持久化对象中
2.1.9.6Delete
从数据库中删除JAVA对象
可以删除持久化对象
可以删除游离对象
2.1.9.7Replicate()
可以把一个数据库中的对象复制到另一数据库
2.1.9.8级联操纵对象
在对象关系映射文件中,用于映射持久化类之间关联关系的元素,如<
<
many-to-one>
和<
one-to-one>
元素都有一个cascade属性,它用于指定如何操纵与当前对象关联的与其它对象
Cascade的属性值列表
None(session操纵当前对象时,忽略关联的对象,此为HIBERNATE的默认设置)
Save-update
Persist
Merge
Delete
Lock
Replicate
Evict
Refresh
All(包含以上)
Delete-orphan(级联删除所有)
All-delete-orphan(包含以上所有)
2.1.9.9与触发器协同操作
1能够激发触发器的事件有INSERT、update,delete
1.1.1当HIBERNATE与触发器协同工作的时候会产生的问题有
1.1.2触发器使session缓存中的数据与数据库不一致
1.1.3例如数据库的timestamp字段会自动插入数据,在映射文件中用insert=false和update=false时,当保存一条数据到数据库,而持久对象的字段则为null
1.1.4解决办法
1.1.5在使用flush()方法保存过数据后,再用reflush()方法重新加载一次数据
2Update方法盲目的激发触发器
2.1.1由于session缓存中不存在对象的快照,update方法为了保险起见,会对每一次UPDATE方法执行UPDATE语句
2.1.2解决办法
2.1.3<
classname=”mypack.customer”table=”customers”select-before-update=”true”>
2.1.10Session
2.1.10.1缓存的三大作用
减少访问数据库的频率
当缓存中的持久化对象之间存在循环关联关系时,Session会保证不出现访问对象图的死循环,以及由死循环引起的JVM堆栈溢出异常
保证数据库中的相关记录与缓存中的相应对象保持同步
2.1.10.2脏检查及清理缓存机制
当一个对象被加入到session缓存中时,Session会为对象的值类型的属性复制一份快照(SnapShot)
在清理缓存时进行dirty-check
2.1.10.3清理缓存的时机
应用程序调用org.hibernate.transaction的commit()方法的时候,commit()会先清理缓存,再向数据库提交事务
当应用程序在执行查询操作时,如果缓存中持久化对象的属性已经发生了变化,就会先清理缓存,使得Session缓存与数据库已进行了同步,从而保证查询结果返回的是正确的数据
应用程序显式调用Session的flush()方法的时候
例外:
如果对象使用native生成器来生成OID,那么当调用Session的save()方法保存该对象时,会立即执行向数据库插入该实体的insert语句
通过Session的setFlushMode()方法来显式设定清理缓存的时间点
i.FlushMode有三种不同的清理模式
1.FlushMode.AUTO
2.FlushMode.COMMIT
3.FlushMode.NEVER
2.1.11管理Session的生命周期
1.自行管理
Session的相关方法
⏹sessionFactory.openSession来获得一个session
⏹session.beginTransaction()方法来开始一个事务
⏹session
◆save
◆update
◆delete
◆….
执行数据操作
⏹Commit()提一个事务
⏹Session.close()结束
2.2.Hibernate有三种方式管理SESSION生命周期
Session对象的生命周期与本地线程绑定
⏹设置Hibernate配置文件的Hibernate.current_session_context_class属性为thread
Session对象的生命周期与JTA事务绑定
⏹设置Hibernate配置文件的Hibernate.current_session_context_class属性为jta
Hibernate委托程序管理Session对象的生命周期
⏹设置Hibernate配置文件的Hibernate.current_session_context_class属性为managed
✓开始事务前,调用org.hibernate.context.ManagedSessionContext.bind(Session)方法
✓事务中,程序用SessionFactory.getCurrentSession()方法来获得当前Session对象
✓提交事务前解除绑定org.hibernate.context.ManagedSessionContext.unbind(SessionFactory)
实现对话(事例说明)
✓人机对话时间长,但事务要原子性的解决办法
✓使用游离对象
✓使用手工清理缓存模式下的session
2.1.12二级缓存
2.1.12.1缓存的适用范围
事务范围
进程范围
集群范围
2.1.12.2持久化层的缓存的并发访问策略
4种类型的访问策略(分别对应4种事务隔离级别),规定了缓存中的数据如何与数据库进行交互
●事务型(Transactional):
事务完全由缓存提供者来管理,这需要缓存提供者本身支持管理事务,如JBOSS
●读写型(Read-write):
这个事务交由session管理,也就说数据库低层必须支持锁机制
●非严格读写型(Nonstrict-read-write)
●只读型(Read-only)
2.1.12.3符合以下条件可以放入二级缓存中
很少被修改的数据
不是很重要数据,允许出现偶尔的并发问题
不会被并发访问的数据
参考数据
●它的实例数目有限
●它的每个实例会被许多其它类的实例引用
●它的实例极少或者从来不会被修改
2.1.12.4以下数据不适合存放到二级缓存中
经常被修改的数据
账务数据,绝对不允许出现并发
与其它应用共享的数据(HIBERNATE无法自动保存二级缓存中数据与数据库一致)
2.1.12.5管理二级缓存
配置二级缓存步骤
●选择需要使用第二级缓存的持久化类,设置它的第二缓存的并发访问策略
●选择合适的缓存插件,每一种缓存插件都有自带的配置文件,因此需要手工编辑该配置文件
配置二级缓存
●Hibernate允许在类和集合的粒度上设置二级缓存。
在映射文件中,<
class>
都有一个<
cache>
子元素,详细如下
1.<
cacheusage=”transactional|read-write|nonstrict-read-write|read-only”
2.Region=”RegionName”
3.Include=”all|non-lazy”
4./>
5.Usage:
指定并发访问策略(必须的)
6.Region:
指定二级缓存的区域的名字(可选的)
7.Include:
当取值为NON-LAZY时,不会缓存映射为延迟加载的属性(LAZY的属性为TRUE的),默认为ALL
8.以ehCache为例
●配置ehcache.xml文件
ehcache>
diskStorepath=”C:
\\temp”/>
内存中存不下时放到硬盘中
defaultCache
maxElementsInMemory=”500”缓存中最多存放的对象个数
eternal=”false”是否永不过期(过期的数据会被删除)
timeToIdleSeconds=”100”允许对象空闲状态的时间
timeToLiveSeconds=”100”允许对象在缓存中存在的最长时间
overflowToDisk=”true”是否允许达到最大对象个数时放到硬盘上
/>
cachename=”basicCar.bean.BasicCar”
maxElementsInMemory=”500”
eternal=”false”
timeToIdleSeconds=”100”
timeToLiveSeconds=”100”
overflowToDisk=”true”
●使用二级缓存
hibernate-configuration>
session-factory>
propertyName=”hibernate.cache.provider_class”>
org.hibernate.cache.EhCacheProvider<
/property>
。
●清除二级缓存对象
9.根据不同的缓存提供者在其缓存配置文件中的过期策略来清除
10.由SessionFactory负责清除
sessionFactory.evict(Category.class,newLong
(1))清除一个对象
sessionFactory.evict(“mypack.Category”)清除所有对象
sessionFactory.evictCollection(“mypack.Category.items”)清除Category类的所有对象的Items集合
2.1.12.6session与二级缓存交互模式
这里主要是session与二级缓存的交互,要与前面的数据库与二级缓存交互区分开来
Session.setCacheMode(CacheMode.*)
CacheMode.NORMAL正常模式(默认),session会向二级缓存中读写数据
CacheMode.IGNORAL忽略模式,不会向二级缓存中读写数据
CacheMode.GET读取模式,会向二级缓存中读数据,但不会写
CacheMode.PUT写入模式,SESSION会向二级缓存中写入从数据库读取的数据,但不会从中读取数据
CacheMode.REFRESH刷新模式,类似于写入模式,区别在于“刷新模式会忽略Hibernate配置文件中的hibernate.cache.use_minimal_puts属性,强制刷新二级缓存中的所有数据”
2.1.13并发
1.并发归类
第一类丢失更新
撤销一个事务时,把其它事务已提交的更新数据覆盖
脏读
一个事务读到另一个事务未提交的更新数据
虚读
一个事务读到另一个事务已提交的新插入的数据
不可重复读
一个事务读到另一个事务已提交的更新数据
第二类丢失更新
这是不可重复读中的特例,一个事务覆盖另一事务已提交的更新数据
2.数据库锁基本原理
数据库锁粒度
✧数据库级
✧表级
✧区域级
✧页面级
✧键值级(表中带有索引的一行数据)
✧行级
锁类型与兼容性
✧共享锁
✧独占锁
✧更新锁
3.数据库事务隔离级别
Serializable串行化
RepeatableRead可重复读
ReadCommited读已提交数据
ReadUnCommited读未提交数据
4.在应用程序中设置隔离级别
HIBERNATE配置文件中设置
a)ReadUncommitted
(1)
b)Readcommitted
(2)
c)RepeatableRead(4)
d)Serializable(8)
设置方法:
Hib
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- hibernate 学习 笔记