【问题标题】:What is the difference between a "Spring transaction" and a "Hibernate transaction"“Spring 事务”和“Hibernate 事务”有什么区别
【发布时间】:2015-05-10 23:58:59
【问题描述】:

能否请您解释一下以下两种交易类型的区别:

  1. 休眠事务
  2. 春季交易

我也想知道@Transactional注解。

【问题讨论】:

  • Spring 事务管理器(如果配置正确)可以管理休眠事务。 @Transactional 是在Spring 中声明事务方法的方式。所以区别与车轮和方向盘的区别是一样的,当“配置正确”时,旋转方向盘会移动车轮......两者都是轮子:)。

标签: java spring hibernate spring-mvc


【解决方案1】:

对于初学者来说,它们都是事务,但它们包含不同的概念和组件。

TL;DR

Hibernate 处理特定于数据库的事务,而 Spring 提供一般事务管理服务。 @Transactional 是配置事务管理行为的好方法。

长篇大论:

交易

事务基本上是作为单个操作进行管理的工作单元(即对某些内容的更改),可以提交或回滚。 Java 世界中有许多不同类型的事务——数据库、消息传递系统(如 JMS)、应用程序间事务(适用于那些胆小的人)或任何其他可能需要包含在事务中的事务。在 Java 标准中,事务是使用 Java Transaction API 管理的,它设置了如何参与事务的规则。

休眠

Hibernate 是一种用于将数据库组件抽象为 Java 对象的 ORM,因此它的事务与数据库中所做的更改特别相关。一个事务可能由对各种数据库表的一次或多次写入组成,一旦操作完成,这些操作就会全部提交。回滚事务,例如在操作过程中出现任何错误,可以撤消所有更改。

春天

在其最低级别Spring 是一个应用程序框架,用于管理对象之间的配置和依赖关系。此外,它还提供了一个接口,用于管理现代应用程序中使用的更高级别的服务,例如数据库、消息传递服务、MVC 框架和事务。

Spring 被设计为在应用程序中用作对象和服务的无所不包的主人,因此它的事务概念比 hibernate 所关注的特定于数据库的事务处于更高的级别。 Spring Transactions 旨在为您提供对所有事务资源的细粒度控制,同时抽象出协调事务所需的通常混乱的编码。

@Transactional

Spring 提供了几种使用事务的不同方法——其中包括基于 xml 的方面、API 编码和基于注释的声明性事务。基于注释的事务很方便,因为您不需要将事务管理样板代码添加到您的应用程序中(即使通过 API 使用 PlatformTransactionManager 也有相当多的编码开销)。

所以基本上@Transactional 发生的情况是,在运行时,sp​​ring 会根据您通过注释配置的内容,扫描您的代码库中的 @Transactional 类和方法,并将它们包装在特定于事务的管理代码中。所以像这样的方法:

@Transactional(propagation = REQUIRES_NEW, rollbackFor = {Exception.class})
public void saveAndSendMessage(Foo foo) throws Exception {
    dbManager.save(foo);
    Bar bar = transform(foo);
    jmsSystem.send(bar);
}  

可以让spring为数据库和jms系统建立一个新的事务,并协调它们,而不需要自动添加所有特定的tx管理代码。

【讨论】:

    【解决方案2】:

    编码级别尊重

    春天

    在Spring中,我们可以执行如下事务

    @Transactional(readOnly=”false”)
    public int insert(int studentId, String name, int courseId) {
        int outcome = 0;
        outcome = studentDao.insert(studentId, name);
        if (outcome > 0) {
       // re-intialize
            outcome = 0;
            outcome = studentCourseDao.insert(studentId, courseId);
        }
       return outcome;
    }
    

    看到@Transactional 后,Spring IOC 容器将要执行事务。如果两者都操作成功,则将执行提交操作。如果任何操作失败,则将执行回滚操作。

    休眠

    在 Hibernate 中我们可以执行如下事务

        public int insert(Student student, Course course) {
          //it is a flag driven transaction
        boolean flag = false;
        Transaction transaction = null;
        Session session = null;
        SessionFactory sessionFactoryRepo = null;
        try {
            sessionFactoryRepo = SessionFactoryRepo.getsessionFactory();
            session = sessionFactoryRepo.openSession();
            // here we are creating the transaction object
            transaction = session.beginTransaction();
    
            int outcome = 0;
            outcome =session.save(student);
            if (outcome > 0) {
              // re-intialize
                outcome = 0;
                outcome = session.save(course);
            }
            flag = true;
            return outcome;
        } catch (Exception e) {
            // TODO: handle exception
        }
        finally {
            if (flag == true) {
                transaction.commit();
            } else
                transaction.rollback();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-12-02
      • 1970-01-01
      • 2021-05-24
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 2015-03-26
      • 2013-05-19
      • 1970-01-01
      相关资源
      最近更新 更多