You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态Web项目中HibernateException异常排查求助

嘿,我来帮你排查下这个问题~

问题核心分析

从你提供的堆栈跟踪信息来看,最关键的错误是java.lang.ClassNotFoundException: org.hibernate.HibernateException——这说明你的Web应用在运行时找不到Hibernate的核心类,哪怕你觉得已经添加了依赖,大概率是依赖包没有被正确部署到Tomcat的运行环境中。另外,你的配置文件加载方式也存在问题,我们一步步来梳理:

你的项目结构

项目结构

你的Hibernate配置文件(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="hibernate.connection.driver_class">org.postgresql.Driver</property> 
    <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/testdb</property> 
    <property name="hibernate.connection.username">postgres</property> 
    <property name="hibernate.connection.password">sql123</property> 
    <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property> 
    <property name="show_sql">true</property> 
    <property name="format_sql">true</property> 
    <property name="hbm2ddl.auto">create </property> 
    <mapping resource="/com/eql/model/Employee.hbn.xml" /> 
  </session-factory> 
</hibernate-configuration>

你的添加员工方法代码

public void addEmployee(Employee employee) { 
  try { 
    Configuration configuration = new Configuration(); 
    configuration.configure("${pageContext.request.contextPath}/hibernate.cfg.xml"); 
    SessionFactory sessionFactory=configuration.buildSessionFactory(); 
    Session session=sessionFactory.openSession(); 
    Transaction transaction =session.beginTransaction(); 
    session.save(employee); 
    transaction.commit(); 
    System.out.println("\n\n Details Added"); 
  } catch(HibernateException e) { 
    System.out.println(e.getMessage()); 
    System.out.println("error"); 
  } 
} 

完整堆栈跟踪信息

May 23, 2018 9:53:11 AM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [EmployeeController] in context with path [/HibernateWebApp] threw exception [Servlet execution threw an exception] with root cause 
java.lang.ClassNotFoundException: org.hibernate.HibernateException 
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1275) 
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1104) 
at com.eql.controller.EmployeeController.doPost(EmployeeController.java:37) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) 
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) 
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:407) 
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376) 
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
at java.lang.Thread.run(Unknown Source) 
错误原因与解决方案

1. 优先级最高:Hibernate依赖未正确部署

ClassNotFoundException的本质是运行时类路径缺失。你说已经添加了所有必要的Hibernate依赖,但很可能这些依赖只在编译时存在,没有被复制到Web应用的WEB-INF/lib目录下——Tomcat只会从这个目录加载第三方类库。

解决步骤:

  • 如果是手动添加依赖:把所有Hibernate相关的JAR包(包括hibernate-core、hibernate-commons-annotations等)以及PostgreSQL驱动包,复制到项目的WEB-INF/lib文件夹中,然后重新部署项目到Tomcat。
  • 如果是用Maven/Gradle构建:确保你的依赖范围是compile(默认值),而不是provided——provided意味着依赖由容器提供,不会被复制到WEB-INF/lib。比如Maven的依赖配置示例:
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>你的Hibernate版本号</version>
</dependency>

2. 配置文件加载路径错误

你代码里用了configuration.configure("${pageContext.request.contextPath}/hibernate.cfg.xml");,这里的${pageContext.request.contextPath}是JSP的EL表达式,在普通Java类(比如你的Controller)里是无法被解析的,这会导致Hibernate找不到配置文件。

解决步骤:

  • 如果你的hibernate.cfg.xml放在src/main/resources目录下(编译后会自动到WEB-INF/classes),直接用configuration.configure();即可——Hibernate会自动在类路径根目录查找这个文件。
  • 如果文件位置特殊,用类路径相对路径,比如configuration.configure("/hibernate.cfg.xml");(前提是文件在类路径根目录)。

3. 额外优化建议:SessionFactory复用

你现在每次调用addEmployee都会重新创建SessionFactory,这是非常消耗资源的错误做法。SessionFactory是线程安全的,应该全局只初始化一次,之后复用。

示例工具类:

public class HibernateUtil {
    private static final SessionFactory sessionFactory;
    
    static {
        try {
            // 自动加载类路径下的hibernate.cfg.xml
            Configuration configuration = new Configuration().configure();
            sessionFactory = configuration.buildSessionFactory();
        } catch (HibernateException ex) {
            throw new RuntimeException("SessionFactory初始化失败", ex);
        }
    }
    
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

修改后的addEmployee方法:

public void addEmployee(Employee employee) { 
  try (Session session = HibernateUtil.getSessionFactory().openSession()) { 
    Transaction transaction = session.beginTransaction(); 
    session.save(employee); 
    transaction.commit(); 
    System.out.println("\n\n Details Added"); 
  } catch(HibernateException e) { 
    System.out.println(e.getMessage()); 
    System.out.println("error"); 
  } 
} 

内容的提问来源于stack exchange,提问作者Jyoti Jadhav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:44:48