Hibernate(21):getCurrentSession还是用openSession?
中, 我们从getCurrentSession执行细节上总结了这个方法生成session的优点. 本篇中,我们还从openSession的执行来看,openSession有没有优势,优势又是什么.
我们先从sessionFactory.openSession()一句开始入手.
在sessionFactory.openSession()方法里,
hibernate又调用了sessionFactory实现类SessionFactoryImpl中的openSession
(interceptor), interceptor是个什么? 它从哪里来的? 这里边是否藏着什么玄机?
看到其类型为org.hibernate.Interceptor接口,它是在new Configuration时由interceptor =
EmptyInterceptor.INSTANCE语句赋了值, 而这个EmptyInterceptor.INSTANCE也正它名字说的那样,
没做什么事. 这样,
我们得出openSession(interceptor)时的interceptor没有给即将诞生的Session带来什么优势. (BTW,
这个interceptor一般用来干啥? 又怎么来设置? 待日后做针对性实验观察)
接着看openSession(interceptor)又调用的openSession(Connection
connection,boolean autoClose,long timestamp,Interceptor
sessionLocalInterceptor)方法.这个方法中参数connection为null, autoClose为false.
有一个long类型的timestamp,它是干啥的? 料它也不会对session的创建带来什么优势,不过"搂草打兔子
"
地把它也研究下.
看SessionImpl类,发现timestamp的存在仅仅是为了实现SessionImplementor接口里定义的方法
getTimestamp. 再往下追,这个getTimestamp方法在哪调用? 主要用来做什么? 有如下所示的调用:
上面getTimestamp的调用中timestamp大多是作为txTimestamp的,与事务有关, 待日后再专门研究,此篇中先放它一马.
这样,一个session就创建出来了, 那跟getCurrentSession相比,有什么优势呢?答案是: 没有.
------------------
结语. 用了两个篇幅, 从源码层面上仔细对比了getCurrentSession跟openSession相比的优势,见Hibernate(21):getCurrentSession还是用openSession
中
的总结. 那么跟跟openSession相比,getCurrentSession在使用上有什么注意的呢?
到现在发现的一个就是,由于getCurrentSession方法返回的session在做事务的commit时,
session可能会自动给关掉,这样若自己的代码中再调用session.close时就抛出了"Session was already
closed"异常, 这也正是这一系列博客的引子.
- 大小: 13.5 KB
分享到:
相关推荐
《Hibernate执行持久层访问步骤详解》 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。它允许开发者使用面向对象的方式进行数据操作,而无需关注底层的SQL语句。本文将...
Hibernate是一个强大的Java持久化框架,它为开发人员提供了一种简单、高效的方式来管理数据库操作。在Java应用程序中,Hibernate作为对象关系映射(ORM)工具,使得开发者可以通过处理Java对象来间接操作数据库,...
在Java的持久化框架Hibernate中,执行原生SQL(Native SQL)是常见需求,尤其是在处理特定数据库特性或者优化性能时。本篇文章将详细介绍在Hibernate中执行原生SQL的几种方式,以及它们各自的适用场景和优缺点。 1....
1. **缓存机制**:Hibernate支持第一级缓存(Session级别的缓存)和第二级缓存(SessionFactory级别的缓存),合理利用可以减少对数据库的访问次数。 2. **懒加载**:对于一对多、多对多关联关系,可以通过懒加载只...
我们将详细阐述其基本概念、对象-关系映射、优势、下载与设置、以及通过实例学习如何使用Hibernate。 【标签】:HibernatePDF 【正文】: 1. Hibernate概述: Hibernate是一个开源的Java持久层框架,主要功能是...
在实际应用中,还需要注意日志配置、缓存管理、性能优化等方面,以充分利用Hibernate的优势。通过深入理解Hibernate的工作原理和API,开发者可以更高效地处理数据库操作,减少手动编写SQL的繁琐工作,提升开发效率。
Hibernate 3.2及以上版本开始支持存储过程的调用,主要通过Session的createSQLQuery方法。 ```java SessionFactory sessionFactory = ...; // 获取SessionFactory Session session = sessionFactory.openSession();...
SpringMVC、Spring和Hibernate是Java开发中三大重要的框架,它们各自负责Web应用程序的不同层面,协同工作以构建高效、可维护的系统。SpringMVC作为Spring框架的一部分,主要用于处理HTTP请求,Spring则提供了依赖...
- **自动化**:Hibernate能够自动生成SQL语句,并自动执行,极大地减少了程序员编写和维护SQL代码的工作量。 - **数据库无关性**:Hibernate支持多种数据库系统,如MySQL、Oracle等,这使得在更换数据库时几乎不...
implementation 'org.hibernate:hibernate-core:5.4.32.Final' ``` 5. **JDBC驱动**: 需要添加MariaDB的JDBC驱动依赖,例如对于Maven: ```xml <groupId>org.mariadb.jdbc <artifactId>mariadb-java-client ...
在IT行业中,Hibernate是一个非常重要的Java持久化框架,它简化了数据库操作,使得开发者可以更加专注于业务逻辑,而不是底层的数据存储。本篇文章将探讨“Hibernate学习一:简单应用1配置文件版”,主要涵盖如何...
1. **Hibernate框架介绍**:Hibernate是一个开源的Java ORM框架,它允许开发人员将Java类与数据库表进行映射,通过对象模型进行数据库操作。它支持JPA(Java Persistence API),并提供了丰富的查询语言HQL...
- hibernate-core.jar:Hibernate的主要实现,包括核心API、持久化机制和查询语言(HQL)。 - jta.jar:Java Transaction API,用于处理事务管理。 - antlr.jar:ANTLR库,用于解析HQL和Criteria查询。 - dom4j....
- 缓存策略:Hibernate提供了第一级缓存(Session级别的缓存)和第二级缓存(SessionFactory级别的缓存),可以显著提高性能。 -延迟加载(Lazy Loading):只在真正需要时才加载关联的对象,减少数据库访问。 -...
Hibernate允许在需要时直接执行SQL查询,如下所示: ```java String sql = "SELECT * FROM USER"; SQLQuery query = session.createSQLQuery(sql); query.addEntity(User.class); List<User> users = query.list();...
- **缓存(Cache)**:Hibernate 提供了一级缓存和二级缓存机制,以提高查询性能和减少数据库负载。 - **查询语言**:除了支持标准的 SQL 查询外,Hibernate 还提供了一种名为 HQL(Hibernate Query Language)的...
**Hibernate 框架简介** Hibernate 是一个强大的 Java ORM(对象关系映射)框架,它允许开发者将数据库操作与业务逻辑解耦,提高了开发效率。ORM 技术的核心是将数据库中的表映射为 Java 类,通过对象的方式来操作...
- 对SQL的灵活性限制:Hibernate的HQL虽然强大,但在复杂的SQL查询方面仍不如原生SQL。 - 学习曲线:对于初学者,理解ORM的概念和Hibernate的使用可能需要一定时间。 - 性能问题:在大数据量、高并发场景下,如果...
### Hibernate概述与关键技术知识点 **标题解读:** "hibernate.txt"暗示了文档内容将围绕Hibernate框架展开,这是Java领域内一个非常重要的对象关系映射(Object-Relational Mapping,简称ORM)工具。 **描述解析...