4

我有这样的代码:

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 实现吗?

4

3 回答 3

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

更新

这不是一个错误,它是一个功能。

由于各种 GAV 下 JTA 工件的激增,Hibernate 将其中一个作为传递依赖项导出可能会在使用另一种 GAV 的环境中导致问题。这应该被标记为已提供,以确保人们在没有明确要求的情况下不会在类路径中获得它。

从那里

使 JTA 成为提供的(非传递的)依赖项

更新 2

无论如何,这是一个错误。不需要transaction-api-1.1.jar在 Hibernate 5.0.7 的依赖中提供。

Hibernate 从公共 API 公开 javax.transaction.Synchronization。无论您是否使用 JTA,您都可以为事务回调注册 JTA 同步。所以 JTA 规范 jar 是一个非可选依赖项。允许它成为非传递性是一个错误,将被恢复:见HHH-10307

于 2015-12-28T12:17:23.577 回答
0

我同意v.ladynev 的回答。5.0.3 版包含事务 API 实现 jar,但 5.0.6 版没有。

来自 Maven 存储库的屏幕截图

核心 Hibernate O/RM 功能 » 5.0.3.Final 依赖项: 在此处输入图像描述

核心 Hibernate O/RM 功能 » 5.0.6.Final 依赖项: 在此处输入图像描述

好像有些应用没有用到事务API,如果有需要可以手动添加。

于 2015-12-28T12:47:51.480 回答
0

要使用 Hibernate Transaction API,您需要从 Session 中获取 org.hibernate.Transaction。请参阅此链接: https ://docs.jboss.org/hibernate/orm/5.0/userGuide/en-US/html_single/#transactions-api

于 2015-12-28T11:17:23.023 回答