`
txidol
  • 浏览: 54340 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

阅读更多

A Session的缓存作用

 

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

 

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

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

 

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

 

1.2刷新缓存时间点

 

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

 

1.3session.setFlushMode(FlushMode.COMMIT)

 

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

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

 

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

 

 

Monkey对象                               生命周期            状态
tx = session.beginTransaction();        开始生命周期        临时状态
Monkey m1 = new Monkey(“Tom”);
session.save(m1);                       处于生命周期        转持久态
Long id = m1.getId();                   处于生命周期       处于持久态
m1=null; //session缓存会引用它
Monkey m2 = (Monkey) session.get (Monkey.class, id);
tx.commit();
session.close();                       处于生命周期         转游离态
System.out.println(m2.getName());      处于生命周期        处于游离态
m2=null;                               结束生命周期       结束生命周期

 

持久化变游离态方法:

 

a.        Session.close()  session缓存被清空
b.        Session.evict()  从缓存中清除一个持久化对象
c.        Session.clear()  清除缓存中所有持久化对象

 

D Session接口详细用法

 

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

 

E 级联操作对象图

cascade属性

 

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

 

G 批量处理数据

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

 

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

 

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

 

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

 

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

 

a)       批量更新session.createQuery(updateHQL ).executeUpdate()
b)       批量删除session.createQuery(deleteHQL ).executeUpdate()
例子:String deleteHQL = “delete Monkey m where m.name = :oldName”
session.createQuery(deleteHQL).setString(“oldName”,”Tom”) .executeUpdate()
c)       批量插入session.createQuery(insertHQL ).executeUpdate()
只支持insert into…select…  不支持insert into …values…

 

 

 

分享到:
评论

相关推荐

    Hibernate学习笔记

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端...

    hibernate学习资料

    这份"hibernate学习笔记"涵盖了以下关键知识点: 1. **Hibernate基本概念**:包括Hibernate框架的核心组件、工作原理、配置文件(hibernate.cfg.xml)以及实体类的标注。 2. **实体管理**:讲解如何定义实体类,...

    Java/JavaEE 学习笔记

    Hibernate学习笔记..........180 第一章 Hibernate入门.....................180 第二章 对象/关系映射基础.............183 第三章 关联关系映射......................185 第四章 操纵持久化对象....................

    J2EE学习笔记(J2ee初学者必备手册)

    Hibernate学习笔记..........180 JavaEE@xuxiang 3 Java/JavaEE学习笔记Jonny xuxiang5612@sina.com 第一章 Hibernate入门.....................180 第二章 对象/关系映射基础.............183 第三章 关联关系映射....

    javaEE学习笔记

    以上是对《Java/JavaEE 学习笔记》中提到的主要知识点的详细总结,涵盖了 Unix、Java 核心概念、JDBC、Hibernate 以及 Servlet 等多个方面。这些内容不仅适合初学者作为入门指南,也为进阶学习者提供了深入研究的...

    Java学习速成笔记

    ##### 知识点1:创建和操纵对象 - **创建对象**:`new 类型(参数列表)`。此语句创建了一个指定类型的对象实例。 - 示例:`String s = new String("Hello World");` - 其中,`new`是关键字,用于创建新的对象实例...

    Hibernate新手上路

    Hibernate是一种开源的对象关系映射(ORM)框架,它主要用于简化Java应用程序与关系数据库之间的交互。ORM框架的主要目标是消除直接的JDBC操作,通过提供一套高级API,使得开发者可以使用面向对象的方式来操作数据库...

    整理后java开发全套达内学习笔记(含练习)

    float 32bit, 9位有效数字,含小数(四舍五入)(小数点算一位,正负号不算) double 64bit, 18位有效数字 注:float 和 double 的小数部分不可能精确,只能近似。 比较小数时,用 double i=0.01; if ( i - 0.01 ) ...

    达内笔记(基础性,很有价值)

    这些知识点构成了Web开发的基础,达内的笔记很可能是对这些技术的详细讲解和实例演示,适合初学者进行系统学习和复习。通过学习和掌握这些技术,可以构建功能完善的Web应用程序,并对数据库进行高效管理。

Global site tag (gtag.js) - Google Analytics