我使用的是Hibernate版本5.4.22.Final和SpringBoot 2.3.5.RELEASE,并使用以下代码:
控制器:
@PostMapping("/insert/{id}")
public MyReposneEntitiy insertAutoAndSendNotification(@PathVariable("id") int id, @Valid @RequestBody Auto auto) {
MyReposneEntitiy e = service.insertAuto(auto, id);
service.sendNotification(id);
return e;
}
字符串
服务:
@Transactional
public MyReposneEntitiy insertAuto(Auto auto, int id) {
InfoForAuto info = infoRepo.findById(id).get();
entityManager.detach(info);
//this is annotated with @Version,
//and it can not be changed if the entity is in Persistence Contexxt
//that's why I'm detaching first and then save
info.setVersion(auto.getVersion());
infoRepo.save(info);
Person person = personService.createPerson(auto.getPerson());
Eng eng = engService.createEng(auto.getEng(), person.getId());
info.setMSDNumber(auto.getMSDNumber());
info.setStatus(Constants.OK);
MyReposneEntitiy response = new MyReposneEntitiy ();
response.setStatus(Constants.OK);
return response;
}
public void sendNotification(int id){
//some code...
}
型
被叫服务方法:
@Transactional
public PersonResponse createPerson(PersonInput pesronInput) {...}
@Transactional
public EngResponse createEng(EngInput engInput, Integer personId) {...}
型
现在,问题是,当insertAuto()方法结束时,我在sendNotification()方法的第一行(在调试模式下),我检查数据库,**在数据库中创建了“person”和“eng”,但信息实体没有更新,**但我需要在调用sendNotification方法之前更新它,我不知道为什么?它们不是在同一个事务中吗?hibernate应该保存所有实体或不保存任何实体?
1条答案
按热度按时间gtlvzcf81#
好吧,我找到问题所在了。
当我调用“
infoRepo.save(info);
“时,保存()方法作为返回对象具有持久化在瘟疫上下文中的实体,所以我所要做的就是info = infoRepo.save(info);
,现在它可以正常工作了。