【问题标题】:How to flush Spring Data JPA before calling stored procedure?如何在调用存储过程之前刷新 Spring Data JPA?
【发布时间】:2019-05-19 06:29:22
【问题描述】:

所以我有 JPA 实体(比如说Foo),其中有FooRepository 定义为CrudRepository<Foo, Long> 的扩展。 Repository 几乎没有自定义方法,其中有一个方法(比如说initFoo)映射到带有@Procedure 注释的存储过程。现在在服务层有一个看起来很像这样的方法(过度简化):

Foo f = new Foo();
f.setId(5)
f.setName("Bar");
FooRepository.save(f);
FooRepository.initFoo(f.getId());

调用此方法会导致存储过程出错。经过仔细检查(违反约束:键foo_id=5 不存在),在FooRepository.save() 完成后,实体Foo 不会立即出现在数据库中。很可能实体管理器决定不急于将实体保存在内存/缓存中。

问题是:如何说服 EM 将该特定实体刷新到 db?我想避免在服务层连接EntityManager 并直接调用flush()。我试过用@Modifying注释存储过程方法,但它似乎只适用于@Query方法。有什么理智的方法可以解决此类问题?

Spring Boot(带有 spring-boot-starter-data-jpa)1.3.3.RELEASE

【问题讨论】:

    标签: java spring spring-boot spring-data-jpa


    【解决方案1】:

    您可以使用包含方法saveAndFlush()的JpaRepository,而不是使用CrudRepsitory

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      • 2017-07-20
      • 2019-05-28
      • 2018-01-03
      • 2015-06-19
      相关资源
      最近更新 更多