java - 如何稍后在调用 save() 的同一方法中使用 Jpa 存储库 save() 中的结果对象?

标签 java spring

在我的 Controller 中,我从服务中调用一个方法,该方法将在我的数据库上调用 save() ,并返回已保存的对象。我要保存的类有一个自动生成的 id,因此当我将其保存到数据库时,我希望返回 id 集(并且工作正常)。在同一个 Controller 中,我将 save() 的结果存储在变量中,我发现它的 id 未设置。这是因为一旦事务完成(当我退出 Controller 方法时), save() 实际上会将 i 保存到数据库中。我的问题是我想在不同服务中退出 Controller 之前使用该结果。我如何强制服务(以及存储库)立即保存它并向我返回结果。

在 classB 中使用 classA 的 id 的原因是因为 classB 是数据库中两个表之间的“连接”表,我应该仅在满足某些条件时才更新它,但这是重点。我已经在存储库中尝试了该服务正在调用的 saveAndFlush() 方法,但它没有帮助。我的服务仅调用 save() 或 saveAndFlush() 方法,没有执行其他操作(因此这不会是服务中的问题)。

我已经尝试过使用 REQUIRES_NEW 进行 @Transactional 注释,但它不起作用。

@PostMapping("")
public ClassA createClassA(@RequestBody ClassA classA){
   ClassA a = classAService.saveClassA (classA);
   System.out.println("Id = " + a.getIdClassA());
   classBService.saveClassB(new classB(a.getId()); //it will cause an exception if a.getId() returns 0

   return classA;
}

System.out.println会打印出Id=0,但应该打印出Id=(数据库生成的某个数字,不能为零,因为数据库有自动增量)

我已经测试了所有其他服务、存储库、连接等。我只是感兴趣如何强制立即响应,以便将其存储在变量中并稍后在方法中使用。

最佳答案

嗯,谢谢您的评论,@JBNizet 和 @Lebecca 你们都是对的:)。事实上,如果我告诉我的类(class) id 将在数据库中生成,saveAndFlush() 会解决我的问题。这就是为什么灵魂是要放置类似 @GenerateValue(strategy = GenerationType.IDENTITY) 的内容,并添加 saveAndFlush() 。经过这两个步骤就成功了。

关于java - 如何稍后在调用 save() 的同一方法中使用 Jpa 存储库 save() 中的结果对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56208707/

相关文章:

java - 是什么导致 org.hibernate.PropertyAccessException : Exception occurred inside setter

java - 使用 spring 表达式语言从 application.properties 解析 LocalTime

java - 如何返回 DataSnapshot 值作为方法的结果?

c# - 通过Java与C#应用程序同步时间

java - 如何将 Java (Hash)Map 上传到 Apache ISIS RestFUL 服务

java - Apache POI api 和 Apache Tika Api 之间的区别?

spring - Spring Boot Actuator + Hal-Browser 和 DevTools 都不工作

hibernate - Spring MVC 表单 :select Tag, 多选未正确绑定(bind)?

java - 使用@Transactional 注解的问题

java - jpa/hibernate 如何通过带注释的外键映射元素集合