Spring Data Jpa / Hades交易行为

时间:2011-04-15 13:28:08

标签: spring jpa transactions dao spring-data

来自Spring Data JPA reference(之前为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显式处理的?

3 个答案:

答案 0 :(得分:2)

这是默认行为。

正如您所看到的,JpaRepository的方法默认标注为@Transactional,默认情况下为传播(REQUIRED),这是该传播类型的正常行为(请参阅10.5.7 Transaction propagation })。

答案 1 :(得分:1)

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

如果要更改CRUD方法的事务配置,只需在具体的存储库界面中重新声明CRUD方法并向其中添加@Transactional包含您想要的配置即可。有关详细信息,请参阅reference documentation

答案 2 :(得分:0)

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

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