Hibernate中SessionFactory内部工作机制及代码执行流程咨询
Hibernate SessionFactory 创建流程与核心机制详解
我来帮你把这些Hibernate的核心流程和机制讲清楚,结合你提到的那几个文件和代码来拆解:
一、buildSessionFactory()的完整执行流程
当你执行SessionFactory factory=new Configuration().configure().buildSessionFactory();这行代码时,整个过程分阶段推进,完全能解答你关心的顺序问题:
Configuration 配置加载阶段
- 首先
new Configuration()创建配置实例,接着configure()会自动加载默认的hibernate.cfg.xml(如果没指定路径的话)。这一步会先读取配置里的所有核心参数——比如数据库驱动、URL、账号密码,还有你设置的hbm2ddl.auto=create——但这时候还不会和数据库建立连接,只是把这些配置暂存起来。 - 然后,Configuration会找到配置文件里声明的
<mapping resource="UserDTO1.hbm.xml"/>(或者你代码里手动添加的映射),开始加载并解析这个映射文件。划重点:这一步是先处理映射资源,再到后续的数据库连接环节。
- 首先
映射文件与DTO的关联逻辑
你肯定在UserDTO1.hbm.xml里写了类似这样的配置:<class name="com.yourpackage.UserDTO1" table="user_table"> <!-- 主键、字段映射等配置 --> </class>这里的
name属性就是关键——它指定了UserDTO1类的全限定类名。Hibernate解析这个映射文件时,会通过反射加载这个DTO类,把类的属性和数据库表的字段一一绑定,同时把这些映射元数据缓存起来,后续操作时就知道哪个类对应哪个表,哪个属性对应哪个字段了。hbm2ddl.auto=create的执行时机
当Configuration完成所有配置和映射解析后,调用buildSessionFactory()才会进入SessionFactory的构建阶段:- 首先会基于配置的数据库信息初始化连接池(比如Hibernate自带的连接池或者你配置的第三方池),这时候才会建立初始的数据库连接(根据连接池的最小连接数配置)。
- 紧接着,Hibernate会检查
hbm2ddl.auto的配置:如果是create,就会根据之前缓存的映射元数据,生成对应的CREATE TABLE语句,然后通过刚建立的数据库连接执行这些语句,创建对应的表。 - 这一步是在SessionFactory正式可用之前完成的,必须等数据库连接建立好、映射元数据都准备齐全才能执行DDL操作。
SessionFactory 最终初始化
完成DDL操作后,Hibernate会把所有映射元数据整合到SessionFactory的内部缓存里,同时初始化事务管理器、SQL生成器、类型转换器等核心组件。最终构建出一个线程安全的SessionFactory实例——通常整个应用生命周期里只需要创建这一个实例。
二、SessionFactory 的内部工作机制
SessionFactory是Hibernate的核心“大管家”,它的核心职责和特性可以总结为这几点:
- 线程安全的单例:一旦创建就不会再修改,整个应用里所有线程都可以共享它,所以通常我们会用单例模式来创建它。
- 元数据缓存:存储所有实体类的映射规则(类表对应、属性字段对应、主键策略等),这些数据在初始化时就加载完成,后续直接复用,避免重复解析。
- 连接池管理:负责数据库连接的复用,当你调用
openSession()获取Session时,SessionFactory会从连接池里拿一个可用连接给Session,Session关闭时再把连接还回去,大大提升性能。 - Session 创建器:每次调用
openSession()或者getCurrentSession(),都会生成一个新的Session实例——注意Session是线程不安全的,每个线程都应该用自己的Session。 - 二级缓存管理:如果配置了二级缓存,SessionFactory会负责管理缓存的生命周期和数据同步,用来缓存跨Session的共享数据,减少数据库查询次数。
- 事务协调:提供事务相关的支持,比如帮你获取事务管理器,协调Session和数据库事务的交互,确保事务的ACID特性。
内容的提问来源于stack exchange,提问作者kavya
相关产品推荐
相关产品推荐

