Hibernate学习笔记(四)【操纵对象篇】

A     Session的缓存作用

[plain]  view plain  copy
  1. 1.1  减少访问数据库的频率  
  2. 1.2  当缓存中的持久化对象间存在循环关联关系时,保证不死循环  
  3. 1.3  保证数据库中相关记录与缓存中的相应对象保持同步  

B     脏检查及刷新缓存的机制

1.1  刷新缓存Flush时,执行SQL顺序

[plain]  view plain  copy
  1. a)        调用session.save()方法的先后顺序,实体执行insert语句  
  2. b)       实体执行update语句  
  3. c)        集合进行delete语句  
  4. d)       集合进行删除、更新或者插入sql语句  
  5. e)        集合进行insert语句  
  6. f)        按照调用session.delete()方法的先后顺序,执行实体删除delete语句  

1.2  刷新缓存时间点

[plain]  view plain  copy
  1. a)      Transaction的commit()方法  
  2. b)     执行查询操作时,缓存中持久化对象属性已经变化,实施同步  
  3. c)      调用Session的flush()方法  

1.3  session.setFlushMode(FlushMode.COMMIT)  

 各种查询方法commit()flush()
FlusMode.AUTO默认清理清理清理
FlushMode.COMMIT不清理清理清理
FlushMode.NEVER不清理不清理清理

C     Java对象在Hibernate持久化层的状态

[plain]  view plain  copy
  1. 临时状态(transient):          刚刚new,未被持久化,不存于Session缓存  
  2. 持久化状态(persistent):       已经被持久化,并且加入Session缓存  
  3. 删除状态(removed):            不在处理Session缓存中并且Session计划从数据库删除  
  4. 游离状态(detached):           持久化转化而来,不存于Session缓存,数据库有对应记录  

[plain]  view plain  copy
  1. Monkey对象                               生命周期            状态  
  2. tx = session.beginTransaction();        开始生命周期        临时状态  
  3. Monkey m1 = new Monkey(“Tom”);  
  4. session.save(m1);                       处于生命周期        转持久态  
  5. Long id = m1.getId();                   处于生命周期       处于持久态  
  6. m1=null; //session缓存会引用它  
  7. Monkey m2 = (Monkey) session.get (Monkey.class, id);  
  8. tx.commit();  
  9. session.close();                       处于生命周期         转游离态  
  10. System.out.println(m2.getName());      处于生命周期        处于游离态  
  11. m2=null;                               结束生命周期       结束生命周期  

持久化变游离态方法:

[plain]  view plain  copy
  1. a.        Session.close()  session缓存被清空  
  2. b.        Session.evict()  从缓存中清除一个持久化对象  
  3. c.        Session.clear()  清除缓存中所有持久化对象  


D     Session接口详细用法

[plain]  view plain  copy
  1. save()  当清理缓存时才执行SQL  
  2. save()  返回对象的标识符,而save方法可以保存任何状态的对象。  
  3. persist()方法无返回值。此外,persist方法只能保存临时态和持久态的对象  
[plain]  view plain  copy
  1. get()   方法始终返回对象的实例,查找指定OID不存在,返回null;  
  2. load() 方法除非在持久化上下文中已经存在一个该标识符定位的对象,不然总是先返回对象的代理,指定OID不存在,抛出ObjectNotFoundException  
  3. 默认所有持久化类都采用延迟检索策略,及映射<class>元素lazy属性默认”ture”  
  4. <class name=”mypack.Monkey” table=”MONKEYS” lazy=”true”>  
  5. lazy属性为”false”,load方法才采用立即检索策略  
  6. get()  忽略该属性,总是采用立即检索策略  
  7. lazy属性为” ture”,load方法采用延迟检索策略,get()采用立即检索  
  8. get()  方法访问各属性  
  9. load()  方法为了删除,或者建立与别的对象的关系  
[plain]  view plain  copy
  1. update() 把游离对象转变为持久对象,计划执行update语句,清缓存时只执行一次  
  2. <classname=”mypack.Monkey” table=”MONKEYS” select-before-update=”true”>  
  3. 变化时,才执行update,所以如果不经常变,就ture,默认为false,经常变时默认  
  4. saveOrUpdate()  判断游离就UPDATE,不是就SAVE  
  5. OID为null,基础类型为OID的话就为初始值如long为id,就是0,或者版本控制version为null,有unsaved-value属性值就以它为准或null,这时就save否则update,如果无该id就抛插入异常  
  6.    
  7. session.merge()关联游离态则复制到同UID持久态对象中,然后将游离态内容更新到数据库中,计划执行update  
  8. session.merge关联游离态若无同UID的持久态对象,则根据该UID加载持久态对象,然后复制到该持久态,计划执行update,若数据库无该uid对象则创建新对象,复制进去,调用save()转持久态  
  9. session.merge关联临时态则创建对象,复制到该对象,最后调save()转持久态对象  
  10. session.updat()关联游离态转为持久态,计划执行update,但本来已存该持久态,则抛异常  
  11.    
  12. session.delete()删除游离态对象,先是游离对象被session关联,变持久态删除  
  13. 删除持久态,计划执行delete语句(清理缓存时,一次一个,不建议再使用)                                                                                               

E     级联操作对象图

cascade属性

[plain]  view plain  copy
  1. 描述  
  2. none                              在保存更新时,忽略其他关联对象,他是cascade默认属性  
  3. save-update                       当通过Session的save(),update()以及saveOrUpdate()方法来保存或更新当前对象时,级联保存所有关联的新建的临时对象,并且级联更新所有关联的游离对象  
  4. delete                            当通过session的delete()方法删除当前对象时,及联删除所有对象  
  5. lock                              把游离对象加入缓存当中,关联对象也加入  
  6. evict                             把持久化对象从缓存中移除,关联对象也移除  
  7. refresh                           刷新当前缓存中对象,级联对象也会刷新  
  8. all                               包含save-update、 delete、 evict、lock及refresh的行为  
  9. delete-orphan                     删除所有和当前对象解除关联关系的对象  
  10. all-delete-orphan                 包含all和delete-orphan  

G     批量处理数据

1.    通过Session来进行批量操作

[plain]  view plain  copy
  1. a)    配置JDBC单次批量处理数目10~50:hibernate.jdbc.batch_size=20  
  2. b)    采用”identity”  
  3. c)    批量操作建议关闭Hibernate二级缓存(SessionFactory应用范围)  
  4.        hibernate.cache.use_second_level_cache=false          进程/集群  
  5.        session.flush();  
  6.        session.clear();  
  7. d)    更新的话用Query q = session.createQuery(selectHQL );  
  8.        ScorllableResults sr =Query.scroll(ScrollMode.FORWARD_ONLY)  
  9.        sr.next()  sr.get(0)  

2.      通过StatelessSession来进行批量操作

[plain]  view plain  copy
  1. a)       StatelessSession session =SessionFactory.openStatelessSession();  
  2. b)       无缓存,加载保存更新数据后都为游离态  
  3. c)       不与二级缓存交互  
  4. d)       立即执行SQL  
  5. e)       不自动进行脏检查,变化内存对象属性后需显示调用update()更新  
  6. f)       不会对关联对象进行任何级联操作  
  7. g)       加载两次同UID对象,是具有不同内存地址的对象  

3.      通过HQL来进行批量操作

[plain]  view plain  copy
  1. a)       批量更新session.createQuery(updateHQL ).executeUpdate()  
  2. b)       批量删除session.createQuery(deleteHQL ).executeUpdate()  
  3. 例子:String deleteHQL = “delete Monkey m where m.name = :oldName”  
  4. session.createQuery(deleteHQL).setString(“oldName”,”Tom”) .executeUpdate()  
  5. c)       批量插入session.createQuery(insertHQL ).executeUpdate()  
  6. 只支持insert into…select…  不支持insert into …values…  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值