0

来自Spring Data JPA 参考(以前的Hades),

默认情况下,存储库实例上的 CRUD 方法是事务性的。

如果一种方法涵盖多个存储库,例如:

@Transactional
public void addRoleToAllUsers(String roleName) {
    Role role = roleRepository.findByName(roleName);
    for (User user : userRepository.readAll()) {
        user.addRole(role);
        userRepository.save(user);
    }
}

参考状态

存储库中的事务配置将被忽略,因为外部事务配置决定了实际使用的配置。

将忽略内部事务的行为是默认的 Spring 事务行为还是由 Spring Data JPA 显式处理?

4

3 回答 3

2

这是一种默认行为。

如您所见,默认情况下,方法的JpaRepository注释@Transactional与传播(REQUIRED)一样,这是该传播类型的正常行为(请参阅10.5.7 事务传播)。

于 2011-04-15T14:10:59.073 回答
1

/ the实现类@TransactionalJpaRepository导致这些方法默认只参与外部事务。因此,如果您认为“忽略”是一个误导性的词,请随时为它打开一个 JIRA(我认为它在某种程度上是;))。

如果您想更改 CRUD 方法的事务配置,只需在具体存储库接口中重新声明 CRUD 方法并添加一个@Transactional包含您想要的配置的方法即可。有关详细信息,请参阅参考文档

于 2011-07-04T12:51:19.953 回答
0

这一切都取决于@Transactional 注释中设置的传播。默认情况下,它设置为REQUIRED,这意味着:如果没有事务上下文,则创建一个并在方法结束时提交;否则,将方法调用包含在现有事务上下文中。

还有其他一些:REQUIRES_NEW、SUPPORTS、NEVER 等。有关详细信息,请参阅http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/transaction/annotation/Propagation.html

于 2011-04-15T14:11:41.297 回答