@Transactional与JPA和Hibernate有什么用?

2022-09-01 21:30:24

我正在学习如何使用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有什么用呢?


答案 1

@Transactional当您希望在事务中执行某个方法/类(=内部的所有方法)时,将使用注释。

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

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

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

如果未指定 ,则每个数据库调用将位于不同的事务中。@Transactional


答案 2

通常,注释是在服务级别编写的。@Transactional

它用于将数据库上的多个写入操作组合为单个原子操作

当有人调用带有所有或没有数据库写入批注的方法时,将执行数据库上的所有写入。@Transactional

在读取操作的情况下,它是没有用的,因此在单个原子写入的情况下也是如此。您在一次读取(选择)中使用它,因此添加或删除注释没有影响。@Transactional


推荐