动态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
相关产品推荐
相关产品推荐

