我正在学习如何使用 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 许可协议
@Transactional
当你想要在事务中执行某个方法/类(=里面的所有方法)时使用注释。假设用户
A
想要将 100 美元转移给用户B
。发生的事情是:让我们假设在成功
1)
之后和执行2)
之前抛出异常。现在我们会有某种不一致,因为A
损失了 100 美元,而B
什么也没得到。交易意味着全部或全无。如果方法中某处抛出异常,则更改不会保留在数据库中。称为rollback
事情发生了。如果您不指定
@Transactional
,每个数据库调用将在不同的事务中。