Java Hibernate运行报错StandardServiceRegistryBuilder.java:165找不到配置文件
Hibernate对接Oracle 11.2 XE时无法找到hibernate.cfg.xml配置文件解决
问题说明
运行Hibernate应用主方法时,执行StandardServiceRegistry ssr = new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build();触发异常,提示无法定位hibernate.cfg.xml资源,错误栈指向StandardServiceRegistryBuilder.java第165行。
相关代码与配置
主类StoreData.java
package hibernate; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.boot.Metadata; import org.hibernate.boot.MetadataSources; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; public class StoreData { public static void main(String[] args) { StandardServiceRegistry ssr = new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build(); Metadata meta = new MetadataSources(ssr).getMetadataBuilder().build(); SessionFactory factory = meta.getSessionFactoryBuilder().build(); Session session = factory.openSession(); Transaction t = session.beginTransaction(); Employee e1 = new Employee(); e1.setId(1); e1.setFirstName("Gaurav"); e1.setLastName("Chawla"); session.save(e1); t.commit(); System.out.println("successfully saved"); factory.close(); session.close(); } }
hibernate.cfg.xml配置
<?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> <property name="hbm2ddl.auto">update</property> <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property> <property name="connection.url">jdbc:oracle:thin:@localhost:1521:xe</property> <property name="connection.username">ceid</property> <property name="connection.password">2361368</property> <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <mapping resource="employee.hbm.xml"/> </session-factory> </hibernate-configuration>
实体映射配置employee.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="hibernate"> <class name="hibernate.Employee" table="EMPLOYEE"> <id name="id"> <generator class="assigned"></generator> </id> <property name="firstName" column="firstname" type="string"></property> <property name="lastName" column="lastname" type="string"></property> </class> </hibernate-mapping>
实体类Employee.java
package hibernate; public class Employee { private int id; private String firstName, lastName; public int getId() { return id; } public String getFirstName() { return firstName; } public String getLastName() { return lastName; } public void setId(int id) { this.id = id; } public void setFirstName(String firstName) { this.firstName = firstName; } public void setLastName(String lastName) { this.lastName = lastName; } }
Oracle建表语句
CREATE TABLE "CEID"."EMPLOYEE" ( "ID" NUMBER(*,0), "FIRSTNAME" VARCHAR2(20 BYTE), "LASTNAME" VARCHAR2(20 BYTE) )
完整错误日志
Sep 11, 2021 6:02:40 PM org.hibernate.Version logVersion INFO: HHH000412: Hibernate Core {5.3.1.Final} Sep 11, 2021 6:02:40 PM org.hibernate.cfg.Environment <clinit> INFO: HHH000206: hibernate.properties not found Exception in thread "main" org.hibernate.internal.util.config.ConfigurationException: Could not locate cfg.xml resource [hibernate.cfg.xml] at org.hibernate.boot.cfgxml.internal.ConfigLoader.loadConfigXmlResource(ConfigLoader.java:53) at org.hibernate.boot.registry.StandardServiceRegistryBuilder.configure(StandardServiceRegistryBuilder.java:165) at hibernate.StoreData.main(StoreData.java:14)
解决方案
这个错误的核心原因是Hibernate默认从类路径根目录加载配置文件,找不到对应路径下的资源,按以下步骤排查即可:
- Eclipse普通Java项目:将
hibernate.cfg.xml和employee.hbm.xml放到项目的src根目录下,不要放在hibernate包对应的子目录中 - Maven/Gradle项目:将两个xml配置文件放到
src/main/resources目录下,构建后会自动输出到类路径根目录 - 检查配置文件名拼写,确认没有大小写错误、后缀名被隐藏为.txt的情况
- 检查IDE编译输出目录(Eclipse对应bin文件夹,Maven对应target/classes文件夹)下是否存在两个xml文件,不存在的话刷新项目重新构建即可
- 如果确实需要把配置文件放到自定义路径,修改configure方法的入参即可,比如配置文件放在hibernate包下,就改为
configure("hibernate/hibernate.cfg.xml")
其余配置、代码、实体映射、数据库表结构均无语法错误,Oracle10gDialect可以兼容Oracle 11.2 XE版本,路径修正后即可正常运行。
内容的提问来源于stack exchange,提问作者Amin Saeedi
相关产品推荐
相关产品推荐

