我有这样的代码:
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
public class Main {
public static void main(String[] args) {
final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
.configure().build();
SessionFactory sessionFactory = null;
try {
sessionFactory = new MetadataSources(registry).buildMetadata()
.buildSessionFactory();
} catch (Exception e) {
StandardServiceRegistryBuilder.destroy(registry);
}
if (sessionFactory != null) {
StudentInfo studentInfo = new StudentInfo();
studentInfo.setRollNo(1);
studentInfo.setName("Dmytro");
Session session = sessionFactory.openSession();
session.beginTransaction();
session.save(studentInfo);
session.getTransaction().commit();
session.close();
sessionFactory.close();
StandardServiceRegistryBuilder.destroy(registry);
}
}
}
它抛出异常:
Exception in thread "main" java.lang.NoClassDefFoundError: javax/transaction/SystemException
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:274)
我读到我应该将必需文件夹中的事务API jar添加到claspath。但是,Hibernate 5.0.6发行包不包含它。
我应该手动添加事务API实现吗?
答案 0 :(得分:2)
看起来这是Hibernate 5.0.6版本的问题。无需为Hibernate 5.0.3版本手动添加transaction-api-1.1.jar
。
添加所需的jar
对于Maven
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version>
</dependency>
用于Gradle构建
compile group: 'javax.transaction', name: 'transaction-api', version: '1.1'
手动下载
http://central.maven.org/maven2/javax/transaction/transaction-api/1.1/transaction-api-1.1.jar
<强>更新强>
这不是一个错误,它是一个功能。
由于JTA工件在各种GAV下的激增,Hibernate导出一个作为传递依赖可能会导致在使用另一个GAV的环境中出现问题。 这应该标记为提供,以确保人们在没有明确要求的情况下不在类路径上获取它。
从那里
Make JTA a provided (non-transitive) dependency
更新2
无论如何这是一个错误。不需要在Hibernate 5.0.7的依赖项中提供transaction-api-1.1.jar
。
Hibernate从公共API公开javax.transaction.Synchronization。无论您是否使用JTA,都可以为事务回调注册JTA同步。所以JTA spec jar是一个非可选的依赖项。允许此变为不可传递是一个错误,将被还原:请参阅HHH-10307
答案 1 :(得分:0)
要使用Hibernate Transaction API,您将从Session获取org.hibernate.Transaction。 看到这个链接: https://docs.jboss.org/hibernate/orm/5.0/userGuide/en-US/html_single/#transactions-api
答案 2 :(得分:0)