【问题标题】:How to connect two Hibernate JPA transactions with Spring @Transactional?如何使用 Spring @Transactional 连接两个 Hibernate JPA 事务?
【发布时间】:2023-02-26 18:56:30
【问题描述】:

在 Spring/Hibernate 应用程序中,两个事务在一个方法中执行。在执行第一个事务并保存实体后,数据库返回相应的 id。第二个实体需要此 ID,然后才能保存它。

@Transactional
public int createAndSaveUser(String username, String email) {

    UserAccountBuilder userAccountBuilder = new UserAccountBuilder(username);
    int id = userAccountBuilder.buildAndSave();

    UserEmailBuilder userEmailBuilder = new UserEmailBuilder(id, email);
    userEmailBuilder.buildAndSave();

    return id;
}

构建器通过调用相应 JpaRepositories 的保存方法来保存实体。

由于 id 是由数据库生成的,我的理解是必须完成第一个事务才能获得该 id。如果第二个事务出了问题,那么第二个事务回滚,但是第一个事务不回滚,在数据库中留下一个没有业务的尸体。

我的问题:

如果出现错误,如何撤消已执行的交易?


非常感谢您的帮助

【问题讨论】:

  • 您的代码是正确的,应该按预期工作。为什么你认为第一个插入不会回滚?
  • 你的理解是错误的。保存实体后您将获得 ID。之后交易仍然可以继续。所以你有了这个 ID 就可以在第二笔交易中做你的事情了。如果失败,您将回滚您的第一笔交易。
  • 因此,如果这段代码应该有效,但不幸的是它不起作用,我将不得不弄清楚问题出在哪里。目前,如果出现错误,只会回滚第二个事务。谢谢(你的)信息。

标签: spring hibernate jpa transactions spring-data


【解决方案1】:

要使用 Spring @Transactional 连接两个 Hibernate JPA 事务,您可以使用以下方法:

  1. 使用@Transactional 注释来注释您的事务方法,这将为该方法创建一个新事务:
    @Transactional
    public void myTransactionalMethod() {
        // code here
    }
    
    1. 将 EntityManager 注入您的方法:
    @PersistenceContext
    private EntityManager entityManager;
    
    1. 使用 EntityManager 启动新事务并执行所需的数据库操作:
    @Transactional
    public void myTransactionalMethod() {
        // start a new transaction
        entityManager.getTransaction().begin();
    
        // perform database operations
        // ...
    
        // commit transaction
        entityManager.getTransaction().commit();
    }
    
    1. 在另一个方法中,也用@Transactional 注释,注入第一个事务方法并调用它:
    @Transactional
    public void myOtherTransactionalMethod() {
        // call the first transactional method
        myTransactionalMethod();
    
        // perform additional database operations
        // ...
    }
    

    通过从另一个事务方法调用一个事务方法,这两个方法将在同一个事务中执行。这允许您将多个数据库操作作为单个工作单元执行,并确保事务边界由 Spring 正确定义和管理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 2011-02-24
    • 2014-06-18
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 2011-08-22
    相关资源
    最近更新 更多