你能用@Modifying而不是@ transmitting创建Spring JPA原生查询吗?

i1icjdpr  于 2023-11-17  发布在  Spring
关注(0)|答案(1)|浏览(177)

在spring Boot 中,我有一个名为process()的方法,它调用几个jpa repo方法。jpa repo方法是原生查询,是插入/更新/删除方法。我希望process()是事务性的(如果对repo的任何调用失败,整个process()方法都应该回滚)。似乎需要在repo方法上添加@transactional,即使process()有@transactional。但是添加@ transactional到repo方法意味着它们都是transactional的,并且会提交一次,所以如果方法3失败,那么方法1和2仍然会提交。有没有办法用@Modifying创建一个原生查询,而不用@Transactional?
举例来说:

  1. @Service
  2. class MyBatchClass{
  3. @Autowired
  4. MyRepo myRepo;
  5. @Transactional
  6. public void process() {
  7. myRepo.method1();
  8. myRepo.method2();
  9. myRepo.method3();
  10. }
  11. }

字符串
repo类:

  1. @Repository
  2. public interface MyRepo extends PagingAndSortingRepository<..., Long> {
  3. @Transactional
  4. @Modifying
  5. @Query(nativeQuery = true, value = "insert into my_table select * from other_table")
  6. Long method1();
  7. @Transactional
  8. @Modifying
  9. @Query(nativeQuery = true, value = "update my_table set my_col = ... ")
  10. Long method2();
  11. @Transactional
  12. @Modifying
  13. @Query(nativeQuery = true, value = "delete from my_table where .... ")
  14. Long method3();
  15. }


注意事项:请与任何告诉我不要使用本机查询而使用JPA实体的本能作斗争。你不知道我的数据模型或我试图做什么。显然,在没有JPA实体的情况下,批量更新/插入/删除更有效。我不想读取表的一百万行,更新一列为空,然后将一百万条记录写回表中。有些地方jpa福尔斯不足,一个简单的本地查询更好。在我的应用程序中的大多数用例中,我确实使用JPA和实体,但在这种情况下没有意义。我也不想使用纯jdbc调用对于这个用例。

l2osamch

l2osamch1#

代码实际上正确工作,我只是犯了一个愚蠢的错误。问题是我从同一bean中的另一个方法调用process(),所以aop代理@transacion被忽略。我将process()移动到另一个服务,现在它的行为正确。

相关问题