在春天,我们是否需要同时@Transactional和@Modifying注释?

我仍然试图围绕@Transactional是如何工作的。

我对服务类的方法进行了注释,并对存储库类中的方法进行了注释。带注释的方法是否适用于带注释的存储库中的方法?@Transactional@Modifying@Transactional@Modifying

我的理解:

@Transactional在没有数据的类的方法上写入数据库,而使用 ,数据被写入数据库。@Transactional( readOnly = true )@Transactional

修改查询

  1. 修改方法签名只能返回 ,或者voidIntegerint
  2. 更新查询必须是事务性的,用@Transactional标记
  3. Spring Data 将删除 EntityManager 中挂起的所有未刷新的更改,使用 @Modifying进行更改(clearAutomatically=false)

正如第二点所说,查询必须具有 ,因此我们可以在级别方法调用或方法级别调用时添加它。如果在级别添加,它也适用于从级别方法调用中调用的方法?@Modifying@Transactional(readOnly=false)@Service@Repository@Service@Respository@Service

例:

@Service
class AnimalServiceImpl implements AnimalService {

@Autowire
AnimalRepository animalRepository;

@Override
@Transactional
public void persistAnimal() {
....
animalRepository.save();
}

@Override
@Transactional(readOnly = true)
public void checkIfAnimalPresent() {

...
animalRepository.checkIfPresent();

}

@Override
@Transactional
public void deleteAnimal() {
...
animalRepository.deleteAnimal();
}
}

存储 库

@Repository
@Transactional(readOnly=true)
public interface AnimalRepository extends org.springframework.data.repository.Repository {

@Modifying
@Query(...)
void save();

@Modifying
@Query(...)
int checkIfPresent() 

@Modifing
@Query(..)
int deleteAnimal();
}

我的问题是围绕着:

  1. 为什么我们需要在服务类中,当我们在存储库级别拥有它并且我有修改实体并将其写入数据库的方法时(只是因为我在类级别有)?@Transactional@Repository@Modifying@Transactional(readOnly = true)
  2. 服务类上的注释是否向类传递?@Transactional@Repository

我希望我在这里的问题和例子非常清楚。


答案 1

这是如何工作的:@Transactional

默认情况下,存储库实例上的 CRUD 方法是事务性的。
对于读取操作,事务配置标志设置为 。
所有其他配置都使用纯值进行配置,以便应用默认事务配置。
如果需要调整存储库中声明的方法之一的事务配置,则可以重写该方法并使用所需的属性值添加注释。readOnlytrue@Transactional@Transactional

改变事务行为的另一种方法是使用(通常)涵盖多个存储库的外观或服务实现。
其目的是为非 CRUD 操作定义事务边界。

如果使用此方法,则存储库中的事务配置将被忽略,因为外部事务(在服务层中定义)配置决定了实际使用的事务配置。

参考:春季数据 JPA - 参考文档 - 5.7。事务性


答案 2

推荐