Repository
的CRUD操作默认都是事务性的,即Repository
默认情况下相当于使用@Transactional
进行了标注。其中对于读操作,会默认设置属性readOnly
为true
。
如果希望针对某个方法自定义事务,则可以在方法上添加标注,如:
public interface UserRepository extends CrudRepository<User, Long> {
@Override
@Transactional(timeout = 10)
public List<User> findAll();
// Further query method declarations
}
上述代码中findAll()
方法没有设置readOnly
属性,并设置了10秒的超时时间。
一个服务(Service)可能引用多个Repository
,其方法也可能包含多个Repository
方法的调用。这种情况下可以在服务层的配置事务行为。
假如有如下一个UserManagementImpl
的服务,其方法的实现需要使用Repository
:
@Service
class UserManagementImpl implements UserManagement {
private final UserRepository userRepository;
private final RoleRepository roleRepository;
@Autowired
public UserManagementImpl(UserRepository userRepository,
RoleRepository roleRepository) {
this.userRepository = userRepository;
this.roleRepository = roleRepository;
}
@Transactional
public void addRoleToAllUsers(String roleName) {
Role role = roleRepository.findByName(roleName);
for (User user : userRepository.findAll()) {
user.addRole(role);
userRepository.save(user);
}
}
addRoleToAllUsers()
方法将会在事务中执行(创建或加入一个事务)。Repository
中定义的事务将会被忽略,服务层定义的事务将会被应用。
提示
注意服务层需要使用<tx:annotation-driven />
或者@EnableTransactionManagement
开启事务管理。使用@SpringBootApplication
标注的话,默认已经开启了事务管理。
登录发表评论 登录 注册