IntelliJ开发Hibernate(JPA)报找不到hibernate.cfg.xml错误
报错核心原因
当前代码混用了Hibernate两套独立的配置加载机制,直接触发了资源找不到的异常:
- 你在
Main.java中使用了原生Hibernate的加载API:new Configuration().configure(),这个方法默认会从类路径下查找hibernate.cfg.xml配置文件 - 但你项目里实际准备的是JPA规范要求的
persistence.xml,项目中根本不存在hibernate.cfg.xml文件,因此直接抛出Could not locate cfg.xml resource的报错
两种可落地的修复方案
方案1:保留现有persistence.xml配置,修改代码加载逻辑
不需要新建任何配置文件,直接调整代码即可:
- 首先确认
persistence.xml的存放路径符合Maven项目规范:必须放在src/main/resources/META-INF/persistence.xml,不能直接放在resources根目录 - 将原来错误的配置构建代码:
替换为JPA标准的引导方式:Configuration configuration = new Configuration().configure().addAnnotatedClass(Student.class); SessionFactory sessionFactory = configuration.buildSessionFactory();
这种方式下,// 需导入javax.persistence.Persistence包 EntityManagerFactory emf = Persistence.createEntityManagerFactory("default"); // 从JPA的EntityManagerFactory中获取Hibernate原生的SessionFactory SessionFactory sessionFactory = emf.unwrap(SessionFactory.class);persistence.xml中已经提前注册了两个实体类,不需要再手动调用addAnnotatedClass重复注册。 - 修正现有persistence.xml的参数错误:你写的用户名配置项
hibernate.connection.user是错误键名,正确的是hibernate.connection.username,不修改的话后续连接数据库会出现权限校验失败的问题。
方案2:保留现有Configuration加载逻辑,补充对应的hibernate.cfg.xml
如果你更习惯用原生Hibernate的加载方式,就不需要依赖persistence.xml了,直接做两个调整:
- 在
src/main/resources目录下新建hibernate.cfg.xml,把原来写在persistence.xml里的数据库连接、实体注册配置全部迁移进去,示例内容如下:<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 数据库连接配置 --> <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/hibernate_test</property> <property name="hibernate.connection.driver_class">org.postgresql.Driver</property> <property name="hibernate.connection.username">postgres</property> <property name="hibernate.connection.password">你的数据库实际密码</property> <!-- 运行期调试配置 --> <property name="hibernate.show_sql">true</property> <!-- 新手调试可选:根据实体类结构自动创建/更新数据库表,省去手动建表的步骤 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 注册关联的实体类 --> <mapping class="entity.Faculty"/> <mapping class="entity.Student"/> </session-factory> </hibernate-configuration> - 修正原来
Main.java里的实体注册遗漏:你原来只通过addAnnotatedClass加了Student.class,没加关联的Faculty.class,即使找到了cfg.xml,后面保存带Faculty关联的Student时还是会抛实体找不到的错。如果已经在cfg.xml里配置了实体映射,这行addAnnotatedClass就可以直接删掉。
新手容易踩的额外坑
- 不要同时保留两套配置(既放hibernate.cfg.xml又放persistence.xml)还混用不同的加载API,很容易出现配置冲突、重复加载实体的问题
- 所有资源类文件(xml配置)都要放在resources目录下,不要直接放在java源码包下,不然编译的时候不会被打包到类路径,还是会报资源找不到
- 本地PostgreSQL需要提前建好名为
hibernate_test的数据库,不然连接环节会直接报错。
内容的提问来源于stack exchange,提问作者Cristian Hreceniuc
相关产品推荐
相关产品推荐

