java - 如何在调用存储过程之前刷新 Spring Data JPA?
问题描述
所以我有 JPA 实体(可以说Foo
),它被FooRepository
定义为CrudRepository<Foo, Long>
. 存储库几乎没有自定义方法,其中有一个方法(比如说initFoo
)映射到带有@Procedure
注释的存储过程。现在在服务层有一个看起来很像这样的方法(过度简化):
Foo f = new Foo();
f.setId(5)
f.setName("Bar");
FooRepository.save(f);
FooRepository.initFoo(f.getId());
调用此方法会导致存储过程出错。经过仔细检查(违反约束:密钥foo_id=5
不存在),该实体在完成Foo
后不会立即出现在数据库中FooRepository.save()
。很可能实体管理器决定不急于将实体保存在内存/缓存中。
问题是:如何说服 EM 将该特定实体刷新到 db?我想避免EntityManager
在服务层接线并直接调用flush()
。我试过用 注释存储过程方法@Modifying
,但它似乎只适用于@Query
方法。有什么理智的方法可以解决此类问题?
Spring Boot(带有 spring-boot-starter-data-jpa)1.3.3.RELEASE
解决方案
而不是使用CrudRepsitory
你可以使用JpaRepository
which contains 方法saveAndFlush()
推荐阅读
- python - Pyrhon:获取当前月份的月份日期?
- php - 如何从刀片 laravel 中的不同表中获取价值?
- react-native - 为什么它截断的方式不同,但两个面板的样式相同?
- performance-testing - Jmeter 测试在本地运行并生成报告,但远程不会停止
- mysql - 加入 6 个没有重复的表
- python - 使用 Python 中的类为树节点分配名称
- vue.js - OIDC 客户端对多租户的支持 - oidc-client 抛出“在存储中找不到匹配的状态”
- api - 有没有办法从 SuiteCRM 的 Rest API 中提取“显示名称”而不是字段名称
- svg - 如何使用 userSpaceOnUse 将渐变重写为 objectBoundingBox?
- plot - 无法在 Octave 中绘制阶跃响应