@Transactional 与 JPA 和 Hibernate 有什么用?

新手上路,请多包涵

我正在学习如何使用 JPA 和 Hibernate 以及 MySQL 数据库创建 REST API,我看到了这个 @Transactional 注释。有人可以解释这个注释的用途吗?

例如我有这个简单的 DAO 类:

 @Repository
public class EmployeeDAOHibernateImpl implements EmployeeDAO {

    // define field for entitymanager
    private EntityManager entityManager;

    // set up constructor injection
    @Autowired
    public EmployeeDAOHibernateImpl(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    @Override
    @Transactional
    public List<Employee> findAll() {

        // get the current hibernate session
        Session currentSession = entityManager.unwrap(Session.class);

        // create a query
        Query<Employee> theQuery =
                currentSession.createQuery("from Employee", Employee.class);

        // execute query and get result list
        List<Employee> employees = theQuery.getResultList();

        // return the results
        return employees;
    }

}

您可以看到用于 findAll() 方法的 @Transactional,但是如果我删除这个 @Transactional,我会得到相同的输出…那么这个 @Transactional 有什么用呢?

原文由 user9608350 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 443
1 个回答

@Transactional 当你想要在事务中执行某个方法/类(=里面的所有方法)时使用注释。

假设用户 A 想要将 100 美元转移给用户 B 。发生的事情是:

  1. 我们将 A 的账户减少 100 美元
  2. 我们向 B 的账户添加 100 美元

让我们假设在成功 1) 之后和执行 2) 之前抛出异常。现在我们会有某种不一致,因为 A 损失了 100 美元,而 B 什么也没得到。交易意味着全部或全无。如果方法中某处抛出异常,则更改不会保留在数据库中。称为 rollback 事情发生了。

如果您不指定 @Transactional ,每个数据库调用将在不同的事务中。

原文由 Pijotrek 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题