在我的控制器中,我从服务中调用一个方法,该方法将在数据库中调用save(),并向我返回保存的对象。我要保存的该类具有一个auto_generated ID,因此,当我将其保存到数据库中时,我希望返回的ID设置正确(并且工作正常)。在同一控制器中,我将save()的结果存储在一个变量中,并且发现它的ID未设置。那是因为save()实际上会在事务完成后将我保存到数据库中(当我退出控制器方法时。我的问题是我想在退出控制器中的其他服务之前使用该结果。如何强制服务(当然也包括存储库)立即保存并返回结果。
在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 =(数据库生成的某个数字,并且不能为零,因为数据库具有AUTO INCREMENT)
我已经测试了所有其他服务,存储库,连接等。我只想知道如何强制响应立即生效,以便可以将其存储在变量中并稍后在方法中使用。
好吧,感谢您的评论,@ JBNizet和@Lebecca都说对了:)。如果我告诉班级将在数据库中生成ID,则saveAndFlush()确实会解决我的问题。这就是为什么要输入@GeneratedValue(strategy = GenerationType.IDENTITY)并添加saveAndFlush()的原因。经过这两个步骤,它起作用了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句