@Transactional 与 JPA 和 Hibernate 有什么用?

13 java hibernate jpa spring-boot

我正在学习如何使用 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

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

Pij*_*rek 28

@Transactional 当您希望在事务中执行某个方法/类(= 里面的所有方法)时,可以使用注解。

假设用户A想向user转账 100$ B。发生的事情是:

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

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

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

  • 一个很好的答案,但应该添加一件事 - 如果示例代码“@Transactional”是不必要的,也许这是“迷信编程”,有人总是添加@Transactional,即使它没有效果“以防万一”:) (5认同)

Dav*_*INO 21

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

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

当有人调用带有@Transactional 所有或不执行数据库写入注释的方法时。

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

  • 在读取操作中,如果使用 Java Streams 来放置选择结果是很有用的... (2认同)