如果您使用的是Hibernate,则这是预期的结果。当你打电话
translationRepository.saveAndFlush(translation),并
translationRepository.findOne(t.getId())一前一后,他们打它保持的所有对象,它已经在工作的高速缓存中的同一个Hibernate
Session。因此,第二个调用只是返回传递给第一个对象的对象。这两行中没有任何内容会迫使Hibernate
SELECT在数据库上为该
Version实体触发查询。
现在,JPA规范
refresh的
EntityManager接口上确实有一个方法。不幸的是,Spring Data
JPA没有使用其
JpaRepository接口公开此方法。如果可以使用此方法,则可以完成该操作
t =translationRepository.saveAndFlush(translation),然后
versionRepository.refresh(t.getVersion())强制JPA提供程序将版本实体与数据库同步。
实现此方法并不困难。只需
SimpleJpaRepository从Spring Data JPA
扩展类并自己实现该方法即可。有关详细信息,请参阅向所有Spring Data
JPA存储库添加自定义行为。
一种替代方法是像
versionRepository.findOne(version.getId())在转换上设置版本实体之前一样加载版本实体。由于您可以在代码中对版本ID进行硬编码,因此您的版本似乎是静态的。因此,您可以将您的
Version实体标记为
@Immutable和
@Cacheable(前者是特定于Hibernate的注释)。这样,
versionRepository.findOne(version.getId())不应在每次调用数据库时都访问数据库。



