SpringBoot中的Hibernate不会在同一事务中持久化所有实体

tquggr8v  于 2023-08-06  发布在  Spring
关注(0)|答案(1)|浏览(118)

我使用的是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应该保存所有实体或不保存任何实体?

gtlvzcf8

gtlvzcf81#

好吧,我找到问题所在了。
当我调用“infoRepo.save(info);“时,保存()方法作为返回对象具有持久化在瘟疫上下文中的实体,所以我所要做的就是info = infoRepo.save(info);,现在它可以正常工作了。

相关问题