在我的控制器中,我从服务中调用一个方法,该方法将在数据库中调用save(),并向我返回已保存的对象。我要保存的那个类具有一个auto_generated ID,因此当我将其保存到数据库时,我希望返回的ID设置正确(并且工作正常)。在同一控制器中,我将save()的结果存储在一个变量中,我发现未设置其ID。那是因为save()实际上会在事务完成后将我保存到数据库中(当我退出控制器方法时。我的问题是我想在退出控制器中的其他服务之前使用该结果。如何强制服务(当然也包括存储库)立即保存并返回结果。
在classB中使用classA的id的原因是因为classB是数据库中两个表之间的“ conncetion”表,因此,仅当满足某些条件时,我才应更新它。我已经在存储库中尝试过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,因此不能为零)
我已经测试了所有其他服务,存储库,连接等。我只想知道如何强制响应立即生效,以便将其存储在变量中,然后在方法中使用。
答案 0 :(得分:0)
好,谢谢您的评论,@ JBNizet和@Lebecca都很正确:)。如果我告诉班级将在数据库中生成ID,则saveAndFlush()确实会解决我的问题。这就是为什么要输入@GeneratedValue(strategy = GenerationType.IDENTITY)并添加saveAndFlush()的原因。经过这两个步骤,它就起作用了。