`
gutou9
  • 浏览: 144606 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

hibernate3 源码阅读 (二) Session

阅读更多

 

上一篇我们看了Configuration 初始化

Configuration cfg = new Configuration();

 

这篇看下和Session相关的

SessionFactory factory = cfg.buildSessionFactory();

 

从Configuration  取得一个 SessionFactory ,

	public SessionFactory buildSessionFactory() throws HibernateException {
		log.debug( "Preparing to build session factory with filters : " + filterDefinitions );
		secondPassCompile();
		validate();
		Environment.verifyProperties( properties );
		Properties copy = new Properties();
		copy.putAll( properties );
		PropertiesHelper.resolvePlaceHolders( copy );
		Settings settings = buildSettings( copy );

		return new SessionFactoryImpl(
				this,
				mapping,
				settings,
				getInitializedEventListeners(),
				sessionFactoryObserver
			);
	}

 

里边要先得到 Settings ,然后用它作为参数,构造SessionFactoryImpl,

Settings 类用来存放hibernate 运行过程中一些信息,配置等,如后边将提到的ConectionProvider。

这个类以后再看,继续看Session,

 

  Session s = factory.openSession();

 

 

看一下 SessionFactory 的 openSession 方法,

	private SessionImpl openSession(
		Connection connection,
	    boolean autoClose,
	    long timestamp,
	    Interceptor sessionLocalInterceptor
	) {
		return new SessionImpl (
		        connection,
		        this,
		        autoClose,
		        timestamp,
		        sessionLocalInterceptor == null ? interceptor : sessionLocalInterceptor,
		        settings.getDefaultEntityMode(),
		        settings.isFlushBeforeCompletionEnabled(),
		        settings.isAutoCloseSessionEnabled(),
		        settings.getConnectionReleaseMode()
			);
	}

 

 

第一个参数 需要一个Connection, 默认情况下是null,

第二个参数 需要一个SessionFactory,SessionFactoryImpl 把自己 (this) 作为参数,

这样一个 SessionImpl 就可以随时回头访问 SessionFactoryImpl 里的内容了,

hibernate中,这种用法比较多,通过this 关键字,把一个个类串联起来。

 

 

我们知道,操作数据库是围绕着 jdbc 进行的,hibernate也一样,

在 sessionImpl 中,有一个比较重要的成员类,JdbcContext,在 SessionImpl 初始化时,他也一同初始化,

 

SessionImpl(
			final Connection connection,
			final SessionFactoryImpl factory,
			final boolean autoclose,
			final long timestamp,
			final Interceptor interceptor,
			final EntityMode entityMode,
			final boolean flushBeforeCompletionEnabled,
			final boolean autoCloseSessionEnabled,
			final ConnectionReleaseMode connectionReleaseMode) {
		super( factory );
		this.rootSession = null;
		this.timestamp = timestamp;
		this.entityMode = entityMode;
		this.interceptor = interceptor;
		this.listeners = factory.getEventListeners();
		this.actionQueue = new ActionQueue( this );
		this.persistenceContext = new StatefulPersistenceContext( this );
		this.flushBeforeCompletionEnabled = flushBeforeCompletionEnabled;
		this.autoCloseSessionEnabled = autoCloseSessionEnabled;
		this.connectionReleaseMode = connectionReleaseMode;
		this.jdbcContext = new JDBCContext( this, connection, interceptor );

		if ( factory.getStatistics().isStatisticsEnabled() ) {
			factory.getStatisticsImplementor().openSession();
		}

		if ( log.isDebugEnabled() ) {
			log.debug( "opened session at timestamp: " + timestamp );
		}
	}

 

JdbcContext 的初始化在 SessionImpl  的构造函数中,也就是JdbcContext随着SessonImpl 一同被初始化,

this.jdbcContext = new JDBCContext( this, connection, interceptor );

 

第一个参数是 this,还是老样子,把自己的引用做参数,

第二个参数是 connection,前边我们说过,默认情况下,这个connection 是null,

第三个参数是 interceptor,这个参数 jdbcContext 碰都没碰,直接传个了ConnectionManager,

 

我们再看 ConnectionManager 的初始化,

ConnectionManager 是hibernate中取数据库连接 (Connection) 的类,

包在jdbcContext 中, 做为jdbcContext  的一个成员,

jdbcContext  要想操作数据库,就要得到数据库的 Connection,

想得到数据库的Connection,就得找他,

 

public JDBCContext(Context owner, Connection connection, Interceptor interceptor) {
		this.owner = owner;
		this.connectionManager = new ConnectionManager(
		        owner.getFactory(),
		        this,
		        owner.getConnectionReleaseMode(),
		        connection,
		        interceptor
			);

		final boolean registerSynchronization = owner.isAutoCloseSessionEnabled()
		        || owner.isFlushBeforeCompletionEnabled()
		        || owner.getConnectionReleaseMode() == ConnectionReleaseMode.AFTER_TRANSACTION;
		if ( registerSynchronization ) {
			registerSynchronizationIfPossible();
		}
	}

 

 JdbcContext随着SessonImpl 一同初始化,而 Connectionmanager 则随着 JdbcContext 一同初始化,

this.connectionManager = new ConnectionManager(
		        owner.getFactory(),
		        this,
		        owner.getConnectionReleaseMode(),
		        connection,
		        interceptor
			);

 

第一个参数,owner 实际就是 SessionImpl,因为SessionImpl 之前把自身作为this传了进来,

第二个参数, 又是 this。

 

 

以上两篇,是 hibernate 初始化的简要过程,包括得Configuration,SessionFactory,Session,JdbcContext,ConnectionManager 等。

 

 

2
0
分享到:
评论

相关推荐

    Hibernate3源码

    为了提高性能,Hibernate3内置了两级缓存:一级缓存(Session级别的)和二级缓存(SessionFactory级别的)。一级缓存默认开启,用于存储当前Session内的对象,避免频繁的数据库访问;二级缓存则可配置第三方缓存插件...

    Hibernate源码解析(三)

    在阅读《Hibernate源码解析(三)》的过程中,配合hibernate源码分析(三).docx文档,读者可以更直观地理解这些概念,并可能涉及具体的类和方法,如`Query`、`SessionFactoryBuilder`、`EntityPersister`等。...

    hibernate的session.flush

    在Java的持久化框架Hibernate中,`Session`是与数据库交互的核心接口,它扮演着连接应用程序和数据库的角色。`Session.flush()`方法...通过阅读和研究源码,可以更深入地掌握其内部机制,有助于解决实际开发中的问题。

    hibernate5.1.10源码包

    通过阅读这些源码,你可以深入理解Hibernate的工作原理,学习如何实现ORM框架,以及优化数据库访问性能。同时,这也是提升Java开发技能和数据库设计能力的好途径。如果你希望深入学习Hibernate,可以从这些模块入手...

    Hibernate源码解析(二)

    在本篇《Hibernate源码解析(二)》中,我们将深入探讨Hibernate这一强大的Java对象关系映射(ORM)框架的内部工作原理。这篇博客旨在帮助开发者更好地理解Hibernate的核心机制,以便于更高效地利用它来处理数据库...

    hibernate-3.2源代码

    一级缓存是每个Session内的缓存,而二级缓存则是在SessionFactory级别,可跨Session共享。 七、事件监听器 Hibernate支持事件驱动编程,如PreInsertEventListener、PostLoadEventListener等,允许用户在特定操作前...

    hibernate-3.2源码包

    9. **第二级缓存(Second-Level Cache)**:Hibernate 支持二级缓存,能提高数据访问速度,减少对数据库的直接访问。常用实现有Ehcache。 10. **懒加载(Lazy Loading)**:Hibernate 提供的一种优化策略,允许关联...

    hibernate-3.5.6 源码

    通过分析Hibernate 3.5.6的源码,开发者可以了解到其内部的事务处理、查询优化、缓存策略等实现细节,这对于提升Java数据库编程技能,或者进行ORM框架的二次开发具有重要意义。这个源码库是一个宝贵的教育资源,可以...

    hibernate5.0.9源码

    Hibernate提供了第一级缓存(Session级别的缓存)和第二级缓存(SessionFactory级别的缓存)。`Cache`接口和`Region`类是处理缓存的核心,源码中可以了解到缓存的插入、查询、更新和清除逻辑。 7. **事务管理** ...

    hibernate源码

    在这个`hibernate-release-4.1.4.Final`版本中,包含了完整的Hibernate源码以及所有必要的jar包,使得我们可以深入理解其工作原理并进行定制开发。 首先,让我们探讨一下Hibernate的核心概念。Hibernate的核心是...

    hibernate_3.1源码

    这暗示了源码阅读是需要耐心和毅力的过程,但最终能够带来深厚的技术积累。 关于"java源码"的标签,表明我们要研究的是用Java语言编写的代码,这包括类、接口、方法等Java编程元素。Hibernate的源码是用Java实现的...

    hibernate3 源码包

    Hibernate 支持一级缓存(Session 缓存)和二级缓存(SessionFactory 缓存)。缓存可以提高数据读取速度,减少对数据库的访问。 9. **一对多、多对一、一对一和多对多关系**: Hibernate3 支持多种对象关系映射,...

    Hibernate源码解析(一)

    《Hibernate源码解析(一)》 在Java开发领域,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。深入理解Hibernate的源码,不仅可以帮助开发者更好地运用该工具,还能提升对Java编程和...

    hibernate源码 直接使用

    标题"hibernate源码 直接使用"表明我们将探讨的是Hibernate框架的源代码,以及如何直接在项目中应用这些源代码。Hibernate是一个流行的Java ORM(对象关系映射)框架,它简化了数据库操作,将数据库交互转化为面向...

    harnessing_hibernate3 源码和书

    《Harnessing Hibernate 3》...通过《Harnessing Hibernate 3》一书和配套源码的学习,开发者不仅可以深入理解Hibernate的工作原理,还能掌握如何在实际项目中应用这些知识,从而提升Java数据库应用的开发效率和质量。

    hibernate源码release-4.1.4.Final版

    Hibernate支持一级缓存(Session级别的缓存)和二级缓存(SessionFactory级别的缓存)。一级缓存默认开启,提高性能但需注意并发问题;二级缓存可配置第三方缓存实现,如EhCache,用于跨Session的数据共享。 五、...

    精通hibernate源码ch5

    《精通Hibernate源码Chapter5:Java对象持久化技术详解》 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。深入理解Hibernate的源码,不仅能帮助开发者提高工作效率,还能...

    Hibernate源码

    Hibernate源码分析有助于深入理解其内部机制,提高开发效率,优化数据库操作性能。 1. **Hibernate核心模块(hibernate-core)** Hibernate的核心模块包含了ORM框架的主要功能,如实体管理、查询语言(HQL)、事件...

    hibernate3基础教程中文版及源码

    通过阅读《Hibernate3基础教程中文版》,并结合提供的源码进行实践,你将能够熟练地掌握Hibernate3的基本用法和最佳实践,为你的Java开发生涯添砖加瓦。同时,源码分析将帮助你更好地理解Hibernate在实际项目中的...

    hibernate 源码直接导入Eclipse

    3. 学习与调试Hibernate源码: - 查阅源码:通过Eclipse的代码导航功能,可以快速定位到具体类和方法,理解其实现逻辑。 - 创建测试用例:为了更好地理解Hibernate的功能,可以创建一些测试用例,模拟数据库操作,...

Global site tag (gtag.js) - Google Analytics