为什么Hibernate 5.0.6发布包不包含事务实现jar?

时间:2015-12-28 11:09:04

标签: java hibernate hibernate-5.x

我有这样的代码:

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发行包不包含它。 enter image description here

我应该手动添加事务API实现吗?

3 个答案:

答案 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)

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

来自maven资料库的屏幕截图

核心Hibernate O / RM功能»5.0.3.Final依赖项: enter image description here

核心Hibernate O / RM功能»5.0.6.Final依赖项: enter image description here

似乎某些应用程序中未使用事务API,因此如果您需要它,您可以手动添加它。