Hibernate源代码分析 在 Hibernate 框架中,SessionFactory 和 ConnectionProvider 是两个非常重要的组件,了解它们的实现机制对于深入了解 Hibernate 的工作原理具有重要意义。本文将通过分析 Hibernate 的源代码,来了解 SessionFactory 和 ConnectionProvider 的实现机制。 从 org.hibernate.cfg.Configuration.java 开始,使用 Hibernate 框架实现应用程序,首先就要与 org.hibernate.cfg.Configuration 打交道,要使用 Configuration.buildSessionFactory() 方法获得一个 SessionFactory。通过分析 buildSessionFactory() 方法的实现,可以了解到 SessionFactory 的创建过程。在 buildSessionFactory() 方法中,会返回一个 SessionFactory 接口的实现 SessionFactoryImpl。 SessionFactoryImpl 是 SessionFactory 的一个实现类,它实现了 SessionFactory 接口。通过分析 SessionFactoryImpl 的实现,可以了解到它是如何创建 Session 的。在 SessionFactoryImpl 中,getCurrentSession() 方法用于获取当前 Session,代码片段如下: public org.hibernate.classic.Session getCurrentSession() throws HibernateException { if (currentSessionContext == null) { throw new HibernateException("No CurrentSessionContext configured!"); } return currentSessionContext.currentSession(); } 在 getCurrentSession() 方法中,SessionFactoryImpl 将获取 Session 的工作委托给了 currentSessionContext.currentSession(),currentSessionContext 是什么?它是 org.hibernate.context.CurrentSessionContext 的一个实例。在 SessionFactoryImpl 的构造函数中,可以看到: currentSessionContext = buildCurrentSessionContext(); buildCurrentSessionContext() 方法用于创建 CurrentSessionContext,代码片段如下: private CurrentSessionContext buildCurrentSessionContext() { String impl = properties.getProperty(Environment.CURRENT_SESSION_CONTEXT_CLASS); // for backward-compatability if (impl == null && transactionManager != null) { impl = "jta"; } if (impl == null) { return null; } else if ("jta".equals(impl)) { // ... } } 在 buildCurrentSessionContext() 方法中,会根据配置文件中的设置来创建 CurrentSessionContext。如果配置文件中没有指定 CURRENT_SESSION_CONTEXT_CLASS 属性,那么将使用默认的实现。 SessionFactory 和 ConnectionProvider 是 Hibernate 框架中的两个核心组件,了解它们的实现机制对于深入了解 Hibernate 的工作原理具有重要意义。通过分析 Hibernate 的源代码,可以了解到 SessionFactory 和 ConnectionProvider 的创建过程,并且了解到它们之间的关系。
- 粉丝: 0
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助