Hibernate学习积累(1)
来源:互联网 发布:db2 删除数据库 编辑:程序博客网 时间:2024/06/05 10:40
Hibernate内置标识符生成器:
increment适用于代理主键,有Hibernate自动以递增的方式生成标识符,每次递增为1;
identity适用于代理主键,由底层数据库生成标识符,前提:底层数据库支持自动增长字段类型,如mysql,DB2,Sql Server,Sybase.
sequence 适用于代理主键,Hibernate根据底层数据库的序列来生成标识符。如Oracle。
native适用于代理主键。根据底层数据库对自动生成标识符的支持能力,来选择identity,sequence或hilo。
assigned适用于自然主键。由Java应用程序负责生成标识符,为了能让Java应用程序设置OID,不能把setId()方法声明为private,应该尽量避免使用自然主键。
select适用于遗留数据库中的代理主键或自然主键。由数据库中的触发器来生成标识符。
foreign用另一个关联的对象的标识符来作为当前对象的标识符,主要适用于一对一关联的场合。
Session的缓存的作用:
1.减少访问数据库的频率。
2.当缓存中的持久化对象之间存在循环关联时,Session会保证不出现访问对象图的死循环,以及由死循环造成的JVM堆栈溢出。
3.保证数据库中的相关记录与缓存中的相应对象保持同步。
Session清理缓存的时间点:
1.当应用程序调用org.hibernate.Transaction的commit()方法时,commit会先清理缓存,再提交事务。Hibernate之所以把清理缓存安排在事物快结束时,一是可以减少访问数据库的频率,二可以尽可能缩短当前事物对数据库中相关资源的锁定时间。
2.当应用程序执行一些查询操作时,如果缓存中的持久化对象的属性已经发生了变化,就会先清理缓存,使得Session缓存与数据库同步,从而保证查询结果返回的是正确的数据。
3.Session显示调用flush()方法时。
脏检查及清理缓存机制:
(1)persist()方法和save()方法
(2)load()和get()方法
(3)update()方法
如果希望session仅当修改了对象的属性时,才执行update语句,可以把映射文件中<class>元素的select-before-update设为true,默认false,修改后会先执行select进行比较.
(4)saveOrUpdate()方法
如果满足以下情况之一,Hibernate把它当做临时对象,否则作为游离对象.
1.Java对象的OID取值为null.
2.Java对象具有version版本控制属性并且取值为null.
3.在映射文件中为<id>元素设置了unsaved-value属性,并且Java对象的OID取值与这个unsaved-value属性值匹配
4.在映射文件中为version版本控制属性设置了unsaved-value属性,并且Java对象的version版本控制属性的取值与映射文件中unsaved-value属性值匹配.
5.为Hibernate的Interceptor提供了自定义的实现,并且Interceptor实现类的isUnsaved()方法返回Boolean.TRUE
(5)merge()方法
merge()方法处理流程:
1.根据游离对象的OID到session缓存中查找匹配的持久化对象.
2.如果在缓存中没有找到与游离对象的OID一致的持久化对象,就根据这个OID从数据库中加载持久化对象.如果在数据库中存在这样的持久化对象,就把游离对象的属性复制到这个刚加载的持久化对象中,计划执行一条update语句,再返回这个持久化对象的引用.
3.如果merge()方法的参数是一个临时对象,那么也会创建一个新的对象,把临时对象的属性复制到这个新建的对象中,再调用save()方法持久化这个独享,最后返回这个持久化对象的引用.
(6)delete()方法
delete()方法处理过程:
1.如果参数是游离对象,先使游离对象被当前session关联,使它变为持久化对象.如果参数是持久化对象则忽略这一步.此步骤确保使用拦截器的场合下,拦截器能正常工作.
2.计划执行一个delete语句
3.把对象从Session缓存中删除,该对象进入删除状态.
如果设置hibernate.use_identifier_rollback为true,delete()方法会把持久化对象或游离对象的OID置为null,使它们转变为临时对象,这样程序就可以重复使用这些临时对象了.
(7)replicate()方法
把一个数据库中的对象复制到另一个数据库中.
第二个参数复制模式:
ReplicationMode.IGNORE:如果在目标数据库中已经存在OID相同的对象,无操作.
ReplicationMode.OVERWRITE:如果目标数据库中已经存在OID相同的对象,覆盖.
ReplicationMode.EXCEPTION:如果目标数据库中已经存在OID相同的对象,抛异常.
ReplicationMode.LAST_VERSION:如果目标数据库中已经存在OID相同的对象,比较两个对象的版本,新则覆盖,否则无操作.要求Hibernate采用的乐观锁并发控制.
(8)session在清理缓存时,按如下顺序执行SQL语句
按照应用程序调用session.save()方法的先后顺序,执行所有对实体进行插入的insert语句.
执行所有对实体进行更新的update语句.
执行所有对集合进行删除的delete语句.
执行所有对集合元素进行删除,更新或者插入的SQL语句.
执行所有对集合进行插入的insert语句.
按照应用程序调用session.delete()方法的先后顺序,执行所有对实体进行删除的delete语句.
如果对象使用native生成器来生成OID,那么当调用session的save()方法保存该对象时,会立即执行向数据库插入该实体的insert语句
(9)默认情况下,session会在以下时间点清理缓存
当应用程序调用org.hibernate.Transaction的commit()方法时候,先清理缓存,再向数据库提交事务.
当应用程序执行一些查询操作时,如果缓存中持久化对象的属性已经发生了变化,就会先清理缓存,使session缓存与数据库同步,保证查询结果正确.
当应用程序显示调用session的flush()方法时.
改变清理缓存时间点
session.setFlushMode(FlushMode.COMMIT)
- Hibernate学习积累(1)
- Hibernate问题积累(1)
- J2ME 学习积累(1)
- Hibernate知识积累(一)
- Hibernate 积累
- c++学习积累1
- jQuery-学习积累-1
- acm学习积累-1
- php学习积累(工作积累、笔试积累,不断增加)
- Hibernate缓存应用(积累与总结)
- hadoop源码学习积累1
- J2ME 学习积累(2)
- VIM学习(积累中....)
- Hibernate学习(1)
- Hibernate学习(1)
- hibernate学习(1)
- Hibernate学习(1)
- TensorFlow 学习积累(1):variable 和 placeholder
- IE的有条件注释详解(附实例代码)
- java设计模式(创建型)之工厂方法模式
- 提问的智慧
- 阻塞,非阻塞,同步,异步
- 关于VS "error LNK2005: 已经在 .obj 中定义"
- Hibernate学习积累(1)
- 百度移动端搜索引擎优化的十个要点
- 永不泯灭的初恋
- 如何将frm格式myd格式文件导入mysql
- php中session_start()函数的作用
- sfgdfg
- java 除法精确度的问题
- 2014 Android面试
- 科研论文写作FAQs