Session.get / load的区别:
1. 如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObejctNotFoundException。
2. Load方法可返回实体的代理类类型,而get方法永远直接返回实体类。
3. Load方法可以充分利用内部缓存和二级缓存中现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取。
Session.find / iterate的区别:
1. find方法将执行Select SQL从数据库中获得所有符合条件的记录并构造相应的实体对象,实体对象构建完毕之后,就将其纳入缓存。它对缓存只写不读,因此无法利用缓存。
2. iterate 方法首先执行一条Select SQL以获得所有符合查询条件的数据id,随即,iterate方法首先在本地缓存中根据id查找对应的实体对象是否存在,如果缓存中已经存在对应的数据,则直接以此数据对象作为查询结果,如果没有找到,再执行相应的Select语句获得对应的库表记录(iterate方法如果执行了数据库读取操作并构建了完整的数据对象,也会将其查询结果纳入缓存)。
[实际的情况是,如果使用了iterate方法返回Iterator类型的查询结果,那么你一旦关闭session,Iterator中的数据立即就会消失.而通过find得到的 List则不会如此,我想大部分人的使用习惯都是操作完成后立即关闭session,很多公司也强制要求这样做. Iterator的另一个麻烦事是fail-fast,在多线程环境下,很容易产生.使用线程安全的List子类,则不会有这个问题]
Query Cache产生作用的情况:
1. 完全相同的Select SQL重复执行。
2. 在两次查询之间,此Select SQL对应的库表没有发生过改变。
Session.save方法的执行步骤:
1. 在Session内部缓存中寻找待保存对象。内部缓存命中,则认为此数据已经保存(执行过insert操作),实体对象已经处于Persistent状态,直接返回。
2. 如果实体类实现了lifecycle接口,则调用待保存对象的onSave方法。
3. 如果实体类实现了validatable接口,则调用其validate()方法。
4. 调用对应拦截器的Interceptor.onSave方法(如果有的话)。
5. 构造Insert SQL,并加以执行。
6. 记录插入成功,user.id属性被设定为insert操作返回的新记录id值。
7. 将user对象放入内部缓存。
8. 最后,如果存在级联关系,对级联关系进行递归处理。
Session.update方法的执行步骤:
1. 根据待更新实体对象的Key,在当前session的内部缓存中进行查找,如果发现,则认为当前实体对象已经处于Persistent状态,返回。
2. 初始化实体对象的状态信息(作为之后脏数据检查的依据),并将其纳入内部缓存。注意这里Session.update方法本身并没有发送Update SQL完成数据更新操作,Update SQL将在之后的Session.flush方法中执行, 根据id更新所有的字段,如update user set name=?, password=? where id=?。
Session.saveOrUpdate方法的执行步骤:
1.首先在Session内部缓存中进行查找,如果发现则直接返回。
2.执行实体类对应的Interceptor.isUnsaved方法(如果有的话),判断对象是否为未保存状态。
3.根据unsaved-value判断对象是否处于未保存状态。
4.如果对象未保存(Transient状态),则调用save方法保存对象。
5.如果对象为已保存(Detached状态),调用update方法将对象与Session重新关联。
Session.delete(E):
1. E 由持久状态/游离状态 -->>自由状态
Session.flush() :
调用flush
1.直接调用Session.flush();
2.tx.commit();
//flush before commiting the transaction and closing the session
//Flushing is the process of synchronising the underlying persistent store with persistable state held in memory.
分享到:
相关推荐
Hibernate Session 绑定线程解决方案 在 Java web 开发中, Hibernate 是一个非常流行的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。然而,在使用 Hibernate 进行数据库操作时,...
总结来说,Hibernate-nosession是一种优化策略,它适合于那些对性能要求较高且不涉及复杂业务逻辑的场景。通过避免频繁打开和关闭Session,可以减少资源消耗,提高系统的响应速度。在实际开发中,我们需要根据项目...
### Hibernate知识点总结 #### 一、Hibernate概述 Hibernate是一个开源的ORM(Object Relational Mapping,对象关系映射)框架,用于Java应用与关系型数据库之间的交互。它通过使用描述对象和数据库之间映射的元...
总结来说,Hibernate简化了Java应用与数据库之间的交互,通过`SessionFactory`和`Session`的使用,我们可以方便地进行数据操作,而无需关注底层的SQL细节。学习并熟练掌握Hibernate和Session,对于提升Java开发的...
总结起来,`Hibernate02`的核心是理解并熟练运用`Session`对象进行数据库操作,掌握HQL以进行面向对象的查询,以及理解在线查询和离线查询的适用场景。这些知识点对于任何涉及Java持久化的开发项目都是至关重要的。...
1. 插入:`session.save()`或`session.persist()`方法创建新记录。 2. 更新:修改实体对象,然后调用`session.update()`或`session.saveOrUpdate()`。 3. 查询:通过`session.load()`加载对象,`session.get()`按ID...
总结来说,`Session.flush()`是Hibernate中不可或缺的一部分,它确保了数据库与应用程序的同步,同时也涉及到了缓存管理、事务控制等多个重要概念。开发者在使用Hibernate时,应当合理运用`flush()`,以提高应用的...
以下是对标题和描述中提到的HibernateTemplate方法的详细总结: A. `get` 和 `load`: 这两个方法都是用于从数据库中获取单个对象。`get`方法直接返回一个实体对象,如果数据库中没有找到对应ID的数据,则返回null...
在 JDBC 基础上,Hibernate 提供了更方便的事务控制方法,如 `Session.beginTransaction()` 和 `Transaction.commit()`。 **性能优化** - **批处理**:通过设置批处理大小,一次执行多个 SQL 语句,减少数据库访问...
《Hibernate4总结文档》 Hibernate4作为一款强大的Java对象关系映射框架,简化了数据库操作,使得开发者可以更专注于业务逻辑而不是数据库层面的细节。本文将深入探讨Hibernate4的配置和使用,帮助开发者更好地理解...
在 Hibernate 中,有两个方法可以获取 Session:getSession() 和 openSession()。这两个方法都可以用于获取 Session,但是它们之间存在一些关键的区别。 getCurrentSession() 方法会将 Session 绑定到当前线程中,...
**Hibernate学习笔记与总结** Hibernate 是一款开源的对象关系映射(ORM)框架,它为Java开发者提供了一种在关系数据库上操作对象数据的便捷方式。本文将深入探讨Hibernate的核心概念、配置、实体类、映射文件、...
总结来说,Hibernate是一个强大的ORM框架,它极大地简化了Java应用的数据库操作,提高了开发效率,并提供了高级特性如缓存、事务管理等。通过深入理解和熟练使用Hibernate,开发者可以构建更高效、更易于维护的...
Hibernate架构主要包括配置、SessionFactory、Session、Transaction和Query等组件。SessionFactory是线程安全的,用于创建Session;Session是工作单元,负责对象的持久化操作;Transaction管理事务;Query则提供了...
Hibernate是Java领域中一款流行的持久化框架,它简化了与关系数据库之间的交互,提供了一种对象关系映射(ORM)的解决方案。以下是对面试中可能会遇到的Hibernate相关知识点的详细解释: 1. **load和get的区别**: ...
Hibernate中获取Session的两种方式代码示例 Hibernate 是一个流行的基于Java的持久层框架,提供了对数据库的访问和操作。Session 是 Hibernate 中一个核心概念,负责管理应用程序与数据库之间的交互。获取 Session ...
【hibernate的一点总结】 Hibernate 是一个流行的 Java ORM(对象关系映射)框架,它允许开发者使用面向对象的方式操作数据库,将Java类与数据库表进行映射,从而避免了直接编写SQL语句的繁琐工作。这个框架的核心...