来自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显式处理的?
答案 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。