`
zzg
  • 浏览: 124520 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

深入浅出hibernate笔记

阅读更多
hibernate数据检索
1.Criteria Query
2.HQL


数据加载
1.即时加载
2.延迟加载
3.预先加载
4.批量加载

hibernate持久化
1.自由态,transient,即实体对象在内存中的自由存在,它与数据库中的记录无关。
2.持久态,persistent,即实体对象处于由hibernate框架所管理的状态。这种状态,实体对象的引用被纳入hibernate实体容器中加以管理。
3.游离态,处于persistent状态的对象,其对应的session实例关闭之后,那么,此对象就处于detached状态。


VO与PO
vo:自由态,游离态
po:持久态

实体对象识别
hashcode,equals

脏数据检查
这里的脏数据并非废弃或者无用的数据,而是指一个数据对象所携带的信息发生了改变之后的状态。
1.数据对象监控(对对象的setter方法设置拦截器)
2.数据版本比对(hibernate采用)

unsaved-value
数据保存时,hibernate将根据这个值来判断对象是否需要保存。
首先,hibernate会读取目标对象的id。
之后,将此值与unsaved-value进行比对,如果相等,则目标对象尚未保存,否则无需进行保存操作。

数据缓存
1.事务级缓存-session lever
2.应用级、进程级缓存-sessionfactory lever
3.分布式缓存-jvm之间共享

hibernate(1,内部缓存 2,二级缓存)
内部缓存实现:session在内部维护了一个map数据类型,此数据类型中保持了所有的与当前session相关联的数据对象。如需加载,首先会分

局所要加载的类和id,在entitiesByKey中寻找。同时加载类也会对map进行管理。

二级缓存考虑:
1.数据库是否与其他应用共享
2.应用是否需要部署在集群环境中
第三方缓存实现接口:
JCS
EHCache
OSCache
JBoss Cache
SwarmCache


需要保证数据访问的排他性。
1.悲观锁
对数据被外界修改持保守态度。是基于数据库的锁机制实现。
query.setLockMode("user",LockMode.UPGRADE);//生成的sql后加for update
Criteria.setLockMode
session.lock

LockMode.none    无锁机制
LockMode.WRITE    在insert和update时,自动获取
LockMode.READ    读取的时候,自动获取

2.乐观锁
大多是基于数据版本记录机制实现。避免了长事务中的数据库加锁的开销。
<class
    optimistic-lock="version"
>


数据加载
1.session.get/load
    如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个objectNotFoundException
    load方法可返回试题的代理类实例,而get方法永远直接返回实体类。
    load方法可以充分利用内部缓存和二级缓存中的现有数据,而get方法则仅仅在内部缓存中进行数据查找,如果没有则直接sql。


find方法执行select sql从数据库中获得所有符合条件的记录并构造相应的实体对象,实体对象构造完毕后,将其纳入缓存。
iterate方法执行时,首先执行一条select sql以获取所有符合查询条件的id,再查询缓存。

hibernate.cache.use_query_cache true


延迟加载
就是在需要数据的时候,才真正执行数据加载操作。
hibernate3同时提供了属性的延迟加载功能。
原理:cglib可以在运行期动态生成java class。真正的对象在代理类.targe中,当调用user.getName方法时,调用代理类的getname方法,会检查target是否存在目标对象,如果不存在则发起查询指令,写回target对象。
集合类型的延迟加载:


session.save    save方法不会把实体对象纳入二级缓存,如果存在级联关系,对此进行递归。
session.update    本身并没有发送update,而是在session.flush(强制数据库同步,在session关闭时自动调用)方法中执行
session.saveorupdate    是save和update方法的组合应用。

数据批量操作
hibernate.jdbc.batch_size 25
1.jdbc
PreparedStatement ps = conn.prepareStatement("insert into TUser(name) values(?);");
for(int k=0;k<400;k++){
    for(int i=0;i<25;i++){
        ps.setString(1,"user");
        ps.addBatch();
    }
    ps.executeBatch();
    conn.commit();
}
2.hibernate
Transaction tx = session.beginTransaction();
for(int i=0;i<10000;i++){
    TUser user = new TUser();
    user.setName("user"+i);
    session.save(user);

    if(i%25==0){
        session.flush();
        session.clear();
    }
}
tx.commit();


hibernate collection
1.set
2.bag:实现了一个允许包含重复元素的 set
3.map

结果集排序
1.sort
<set name="addresses"
    sort="org.sample.LengthComparator"></set>实现了接口java.util.Comparator
2.order by
<set name="addresses"
    order-by="address desc"></set>实现中借助了jdk1.4中的新增集合类linkedHashSet以及LinkedHashMap。

hibernate回调与拦截机制
hibernate通过lifecycle,Validatable接口制定了对象CRUD过程中的回调(CallBack)方式。
Interceptor接口定义了hibernate中的通用拦截机制。

hibernate分页
Criteria criteria = session.createCritera(TUser.class);
criteria.add(Expression.eq("age","20"));
criteria.setFirstResult(100);
criteria.setFetchSize(20);
同样,query接口也提供了一致的方法。抽象类net.sf.hibernate.dialect指定了所有底层数据库的对外统一接口。

session管理
ThreadLocal模式得到了大量使用。
ThreadLocal是java中一种较为特殊的线程绑定机制。通过ThreadLocal存取的数据,总是与当前线程相关,也就是说,jvm为每个运行的线程

,绑定了私有的本地实例存取空间,从而为多线程环境常出现的并发访问问题提供了一种隔离机制。
localSession.set(getSession());//获取session实例并保存
Session session = (Session)localSession.get();//通过get方法取出session
原理:在jvm中维护一个map,这个map的key就是当前的线程对象,而value则是通过ThreadLocal.set方法保存的对象实例。


hibernate优化策略
1.在允许的情况下,选用最新版本的hibernate
2.制定合理的缓存策略
3.采用合理的session管理机制
4.尽量使用延迟加载特性
5.设定合理的批处理参数(batch_size)
6.如果可能,选用uuid作为主键生成器
7.如果可能,选用基于version的乐观锁策略替代悲观锁
8.开发过程中,打开hibernate.show_sql
分享到:
评论

相关推荐

    《深入浅出Hibernate》读书笔记

    总之,《深入浅出Hibernate》读书笔记涵盖了实体对象生命周期的转换、实体对象的识别机制以及Hibernate的多级缓存策略,这些都是理解并有效使用Hibernate的关键点。通过深入学习这些概念,开发者能够更好地掌握...

    深入浅出Hibernate学习笔记

    在深入理解Hibernate的过程中,Criteria Query是一个重要的概念,它是Hibernate提供的一种面向对象的查询方式,使得开发者可以避免直接编写SQL语句,从而更加专注于业务逻辑。Criteria API允许我们将查询条件封装成...

    马士兵hibernate学习笔记(原版)

    《马士兵Hibernate学习笔记》是一份深入浅出的教程,旨在帮助初学者掌握Hibernate这一流行的Java持久化框架。Hibernate是一个对象关系映射(ORM)工具,它允许开发者用面向对象的方式来操作数据库,从而减少了传统...

    Hibernate笔记

    【Hibernate笔记】是一份...这份笔记通过详细的实例和代码示例,深入浅出地讲解了Hibernate的核心特性,无论是初学者还是有经验的开发者,都能从中获益,进一步提升在J2EE环境下使用Hibernate进行数据库操作的能力。

    Hibernate 学习笔记&代码.zip

    本学习笔记和代码资源是基于黑马程序员在 B 站上的《Hibernate框架》课程,该课程深入浅出地讲解了 Hibernate 的核心概念和实际应用。 **第一天:Hibernate 概述与环境搭建** 1. **Hibernate 概念**:Hibernate 是...

    2023年Java相关课程系列笔记之十四Hibernate学习笔记.doc

    在本篇“2023年Java相关课程系列笔记之...总结,这门课程深入浅出地讲解了Hibernate的核心概念、使用方法以及其在Java开发中的优势。通过学习,开发者能够熟练掌握如何利用Hibernate进行高效的数据操作,提升开发效率。

    Hibernate入门笔记

    本笔记将深入浅出地介绍Hibernate的核心概念、配置、实体类的创建以及如何进行CRUD操作。 ### 一、Hibernate概述 Hibernate 是一个开源的ORM框架,它通过映射Java类到数据库表,将对象模型与关系模型关联起来,...

    hibernate-3.4.0资料集锦

    1. 尚学堂 Hibernate 学习笔记:尚学堂是一家知名的在线教育机构,其Hibernate教程深入浅出,适合初学者入门。笔记内容包括Hibernate的基本概念、配置、实体类、映射文件、Session接口的使用、事务管理等。 2. 达内 ...

    hibernate学习超强知识点荟萃

    这是超强的学习笔记,包学包会,里面涵盖了hibernate的所有知识点,深入浅出

    李兴华SSH课堂笔记

    李兴华老师的SSH课堂笔记深入浅出地讲解了这三大框架的核心概念、工作原理以及实际应用。 **Struts框架** Struts是Apache组织提供的一个开源MVC框架,它主要负责应用程序的控制流程。在Struts中,Action类是业务...

    hibernate入门必看

    本篇将深入浅出地介绍Hibernate的基础知识,帮助初学者快速入门。 ### 1. Hibernate概述 Hibernate 是一个开源的ORM框架,它的主要作用是将Java对象与数据库表进行映射,实现了对象的持久化。通过使用Hibernate,...

    java并发编程实践笔记资料.pdf

    16. 使用ThreadLocal变量可以确保线程封闭性,例如hibernate openSessionInView机制和jdbc的connection机制。 17. 单一不可变对象往往是线程安全的,但是复杂不可变对象需要保证其内部成员变量也是不可变的。 18. ...

    尚硅谷springboot核心技术笔记

    这份笔记深入浅出地解析了Spring Boot的各个关键组成部分,旨在帮助开发者从底层理解并熟练掌握Spring Boot的使用。 首先,Spring Boot的基础部分包括了自动配置、起步依赖和嵌入式Web服务器的概念。自动配置是...

    Android&Java; 技术笔记 等五本

    技术笔记 等五本"的压缩包内容涵盖了多个关键知识点,包括Animation动画详解、iOS 9人机交互指南、Java面试笔记以及深入浅出Java Web。下面将对这些主题进行详细阐述。 首先,我们来看Android的Animation动画详解...

    良格葛的java学习笔记

    这份笔记以其独特的视角和深入浅出的讲解方式,深受学习者喜爱,尤其适合初学者及有一定基础的开发者进行进阶学习。笔记可能包含了从基础语法到高级特性的全面覆盖,旨在帮助读者掌握Java的核心概念和技术。 在Java...

    hibernate学习资料

    这份学习笔记不仅适合初学者,也适用于有一定经验的开发者,因为它深入浅出地阐述了Hibernate的关键特性,并提供了丰富的实例来帮助理解。通过系统学习和实践,开发者可以更好地掌握Hibernate,从而在实际项目中灵活...

    JSF+Spring+Hibernate相关技术文档

    JSF+Spring+Hibernate的实例讲解.doc则可能通过具体的案例,深入浅出地解释了这三个技术如何协同工作,帮助开发者理解它们在实际项目中的应用。例如,它可能会涉及如何使用JSF的Managed Beans来处理用户输入,通过...

    深入浅出Struts2

    《深入浅出Struts2》课程是一门针对Java Web开发者设计的专业教程,旨在教授如何高效地使用Struts2框架构建动态、复杂的Web应用程序。Struts2作为一款强大的MVC(Model-View-Controller)框架,它极大地简化了Java ...

    良格葛的hibernate教程之CHM版

    该教程由良格葛编写,他在Java社区中有较高的知名度,尤其以其深入浅出的讲解风格而闻名。这个CHM(Compiled HTML Help)版本将所有教程内容整合在一个可搜索的离线文档中,方便开发者随时查阅。 【描述】:“良格...

Global site tag (gtag.js) - Google Analytics