在spring data jpa中,我们是否只需要@Transactional的write方法?

roejwanj  于 2023-02-19  发布在  Spring
关注(0)|答案(1)|浏览(125)

例如,我有两个存储库方法,如

@Query("select * from person        where name  = ?1", nativeQuery = true)
Person findPersonByName(String name);
@Modifying 
@Query("delete from person where id  = ?1", nativeQuery = true)
int deletePersonById(Long id);

在这里,第一个方法工作正常,返回一个实体person。
但是第二个方法抛出TransactionRequiredException
根据文档,CrudRepository方法默认是事务性的。
我从这个声明中理解到,RepositoryCrudRepository的那些方法在实现存储库的代理类中被标记为@Transactional,并且定制查询方法不是事务性的。
如果是这样的话,我的第一个方法不需要事务性注解吗?没有事务性,它是如何工作的?
为什么第二种方法只有在包含事务注解时才有效?
我试着在第二个方法上添加事务注解,效果很好。
但是为什么第一个方法不需要这个注解,为什么第一个方法即使没有显式应用事务注解也能工作?

daupos2t

daupos2t1#

这可以归结为EntityManager的规范,它基本上需要一个事务来执行写操作(mergepersistdelete),而不需要一个事务来执行阅读操作。

相关问题