加载Hibernate配置文件时出现javax.transaction.SystemException缺失异常求助
问题描述
本人使用Eclipse IDE 2023、JavaSE-19版本,基于hibernate-search-5.8.0.Final-dist依赖开发项目,在加载Hibernate.cfg.xml文件时,HibernateUtil.java中抛出java.lang.NoClassDefFoundError: javax/transaction/SystemException异常。已尝试多种依赖组合,仍未解决。
错误栈
Exception in thread "main" java.lang.NoClassDefFoundError: javax/transaction/SystemException at org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator.initiateService(JtaPlatformInitiator.java:34) at org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator.initiateService(JtaPlatformInitiator.java:26) at org.hibernate.service.spi.ServiceRegistryImpl.initiateService(ServiceRegistryImpl.java:242) at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:264) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:239) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:216) at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:278) at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:465) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:708) at com.example.HibernateUtil.getSessionFactory(HibernateUtil.java:15) at com.example.Main.main(Main.java:10) Caused by: java.lang.ClassNotFoundException: javax.transaction.SystemException at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ... 11 more
项目代码
HibernateUtil.java
import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static final SessionFactory sessionFactory; static { try { // 加载Hibernate配置文件 sessionFactory = new Configuration().configure().buildSessionFactory(); } catch (Throwable ex) { System.err.println("Initial SessionFactory creation failed." + ex); throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } }
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">com.mysql.cj.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/testdb</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">password</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property> <property name="hibernate.hbm2ddl.auto">update</property> <property name="hibernate.show_sql">true</property> <!-- Hibernate Search配置 --> <property name="hibernate.search.default.directory_provider">filesystem</property> <property name="hibernate.search.default.indexBase">./lucene/indexes</property> </session-factory> </hibernate-configuration>
数据库表结构
CREATE TABLE `user` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `email` varchar(100) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
解决方案
1. 补充JTA API依赖
Hibernate Search 5.8依赖javax.transaction.SystemException类,该类属于JTA API包。由于Java 9+不再默认包含该API,需手动添加依赖:
Maven项目添加依赖
在pom.xml中加入:
<dependency> <groupId>javax.transaction</groupId> <artifactId>javax.transaction-api</artifactId> <version>1.3.3</version> </dependency>
手动导入jar包
下载对应版本的javax.transaction-api jar包,放入项目lib目录并添加到Eclipse构建路径。
2. 调整Java版本(推荐)
Hibernate Search 5.8.0.Final官方仅支持Java 6、7、8,Java 19属于超版本使用,存在API兼容风险。建议:
- 降级Java版本到Java 8或Java 11(LTS版本,兼容性更稳定)
- 或升级Hibernate Search到6.x版本(支持Java 11+,但需注意6.x使用Jakarta EE API替代javax,需同步调整相关依赖和代码包路径)
3. 禁用JTA平台(临时 workaround)
若暂时无法调整依赖或Java版本,可在Hibernate.cfg.xml中显式禁用JTA平台,避免加载相关类:
<property name="hibernate.transaction.jta.platform">org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform</property>
内容的提问来源于stack exchange,提问作者GUMMALLA DRONA SAI
相关产品推荐
相关产品推荐

