在 Hibernate 的 XML 配置体系中,cfg.xml 通常放在类路径根目录,作为启动时最先被读取的配置文件。它由 org.hibernate.cfg.Configuration 对象解析,围绕 session-factory 节点组织数据库连接、方言和映射资源。所有通过 SessionFactory 创建会话的操作,最终都依赖 cfg.xml 里定义的参数。下面从实际工程角度拆解它的结构和写法。

cfg.xml 文件结构与加载流程
一个标准的 cfg.xml 文件从 XML 声明开始,随后是 DOCTYPE 声明,用来引入 Hibernate 3.0 版本的 DTD 约束。根节点是 hibernate-configuration,内部必须包含 session-factory 子节点。所有数据库连接属性和映射资源都写在 session-factory 中。这个结构不能随意调换,否则解析器会直接报错。
加载 cfg.xml 最常见的方式是调用 new Configuration().configure()。如果不传参数,Hibernate 会去类路径根目录查找名为 hibernate.cfg.xml 的文件。如果文件放在其他位置,可以使用 configure(String resource) 指定路径。解析完成后,通过 buildSessionFactory() 创建会话工厂。下面是一个最简骨架,只包含结构声明,不包含具体连接参数:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 数据库连接属性 -->
</session-factory>
</hibernate-configuration>
DOCTYPE 中的 DTD 地址用于本地校验,如果开发环境无法访问外网,Hibernate 可能会尝试联网获取 DTD 导致启动变慢。此时可以将 DTD 文件放到本地,并修改 XML 中的引用路径。不过多数现代构建工具会缓存 DTD,实际影响有限。
数据库连接核心参数详解
连接数据库的最小参数集合包含驱动类、连接地址、用户名和密码。在 cfg.xml 中,这些参数通过 property 标签配置,name 属性固定为 hibernate.connection.driver_class、hibernate.connection.url、hibernate.connection.username 和 hibernate.connection.password。这四者是 Hibernate 底层获取 JDBC Connection 的依据,缺少任何一项都会在构建 SessionFactory 时抛出异常。
以 MySQL 8 为例,驱动类应写成 com.mysql.cj.jdbc.Driver,连接地址通常为 jdbc:mysql://localhost:3306/dbname,并且建议显式加上 useSSL=false 和 serverTimezone=UTC 两个参数。如果使用 MySQL 5 的旧驱动,驱动类为 com.mysql.jdbc.Driver,但在 8.0 版本中该驱动类已经被标记为废弃,应优先使用新的 cj 驱动。密码字段在 XML 中直接以明文书写,生产环境建议配合外部化配置或加密方案处理。
除了四个基础参数,方言属性 hibernate.dialect 同样关键。方言决定了 Hibernate 生成 SQL 时的语法风格,例如分页、自增主键和函数调用。MySQL 8 对应的方言为 org.hibernate.dialect.MySQL8Dialect,MySQL 5 使用 org.hibernate.dialect.MySQL5Dialect。如果方言与数据库版本不匹配,建表语句、分页查询可能出现语法错误,但错误往往要到真正执行 SQL 时才会暴露。
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">123456</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>
这段配置可以直接放在 session-factory 节点内部。注意 URL 中的 & 在 XML 中必须写成 &,否则 XML 解析器会把 & 当作实体引用起始符,导致解析失败。很多初学者在连接带参数的 MySQL 地址时遇到 SAXParseException,原因就在这里。
如果需要启用连接池,可以继续添加 hibernate.c3p0 相关的属性。Hibernate 内置对 C3P0 的支持,配置 max_size、min_size、timeout 等参数能够减少频繁建立数据库连接的开销。不过在现代项目中,更常见的做法是使用独立的连接池组件,再通过 JNDI 或数据源方式注入,cfg.xml 直接配置连接池已经逐渐减少。
映射文件与运行时选项配置
除了连接信息,cfg.xml 还要告诉 Hibernate 哪些实体类或映射文件需要管理。使用 XML 映射时,通过 mapping resource 属性指定 .hbm.xml 文件的路径。路径必须相对于类路径根目录,不能写成文件系统的绝对路径。例如实体映射文件位于 com/example/entity/User.hbm.xml,就写 mapping resource 的值为 com/example/entity/User.hbm.xml。
如果使用注解方式映射实体,则改用 mapping class 属性,值为实体类的全限定名。一个 session-factory 中可以有多个 mapping 标签,分别列出所有实体。漏写映射会导致 Hibernate 在查询时抛出 Unknown entity 异常,这是配置阶段最常见的错误之一。
运行时选项里,hibernate.hbm2ddl.auto 控制数据库结构的自动维护策略,取值包括 create、update、validate 和 create-drop。开发阶段常用 update,让 Hibernate 自动补建缺失的表结构,但生产环境不建议使用自动建表,应当使用数据库迁移脚本管理表结构。另外两个常用开关是 hibernate.show_sql 和 hibernate.format_sql,分别控制控制台输出 SQL 和格式化输出,便于调试慢查询。
<mapping resource="com/example/entity/User.hbm.xml"/> <property name="hibernate.hbm2ddl.auto">update</property> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property>
hbm2ddl.auto 取值为 create 时,每次启动都会删除并重建表结构,已有数据会丢失,因此只适合测试环境。validate 模式只做结构校验,不会修改数据库,适合与手动建表脚本配合使用。选择哪个值取决于团队对数据库结构的管理方式,而不是个人习惯。
常见配置错误与排查思路
cfg.xml 解析失败的第一类原因是 XML 格式错误。比如属性值中包含与号、小于号或大于号等特殊字符时没有转义,或者标签没有正确闭合。Hibernate 启动阶段会抛出 MappingException 或 SAXParseException,此时应优先检查 XML 文件本身的合法性,可以用 IDE 的 XML 校验功能快速定位。
第二类常见问题是驱动类找不到。这通常不是 cfg.xml 写错,而是项目缺少对应的 JDBC 驱动依赖。以 Maven 为例,需要在 pom.xml 中引入 mysql-connector-java 依赖,版本要与数据库服务端匹配。如果使用 Gradle,也需要声明对应依赖。没有驱动类时,错误信息会包含 ClassNotFoundException,很容易识别。
第三类问题是方言与实际数据库不匹配。例如数据库是 MySQL 8,但方言写成 MySQL5Dialect,可能前期的简单查询正常,一旦用到分页或日期函数就报语法错误。建议在开发初期就锁定方言版本,并在测试环境执行一次完整建表和分页查询,避免问题延后到上线阶段。
还有一类隐蔽问题是映射路径错误。XML 映射文件的 resource 路径大小写必须与文件系统完全一致,部分操作系统区分大小写。如果把 User.hbm.xml 写成 user.hbm.xml,Windows 上可能正常,部署到 Linux 后就会失败。使用统一的小写包名和文件名,可以减少这类跨平台问题。
最后需要说明,cfg.xml 并不是 Hibernate 唯一配置方式。新项目可以使用基于 JPA 的 persistence.xml,或者完全通过 Java 代码配置。不过 cfg.xml 结构直观、便于集中管理,在维护旧系统或学习 Hibernate 原理时仍然非常常见。掌握它的参数含义和排查方法,能帮助你更快定位配置层的问题。
Hibernate配置cfg.xml数据库连接修改时间:2026-09-28 02:06:32