gpt4 book ai didi

java - hibernate 更新而不是在保存后抛出预期错误

转载 作者:行者123 更新时间:2023-12-01 12:28:24 25 4
gpt4 key购买 nike

我的代码运行良好,但根据我对 Hibernate 的了解,不应该运行。

我正在对对象执行保存操作,如下所示:

    IProfile profile = profileManager.getById(profileDtoModifyForm.getId());


profile.setName(profileDtoModifyForm.getName());
profile.setDescription(profileDtoModifyForm.getDescription());

profileManager.save(profile);

profileManager.getById()方法使用org.Hibernate.Session.get()方法来获取对象

profileManager.save()方法使用org.Hibernate.Session.save()但我期待一个错误,因为该对象已经存储在数据库中并且有一个 id。

相反,hibernate 执行更新:

Hibernate: update profile set description=?, name=? where id=?

那我不明白save和saveOrUpdate方法之间的区别...

经过一些研究,我发现了很多描述。一个说如果 id 存在,hibernate 就会执行更新,另一个说它应该抛出一个错误...

ps:我使用Spring,如果它改变了什么......

最佳答案

如果你看一下javadocSession.save 方法中,您将看到它讨论 transient 实例。这意味着非 Hibernate 托管实体。当您执行 Session.getById 来检索对象时,它是一个 transient 实例。

如果您使用 transient 实例,它确实会导致异常,表明具有给定标识符的对象已经存在。但是,由于这已经是托管实例,因此会检测到该实例,并且不会保存而是发出更新。

要对此进行测试,只需创建要保存的配置文件的新实例,为其提供数据库中已存在的 ID 并尝试存储它。

另一方面,因为它已经是一个托管实例,您甚至不需要调用 save 来保存更改,这些更改将自动与数据库同步。

savesaveOrUpdate 之间的主要区别在于返回类型。使用save时,会返回新创建的id。saveOrUpdate返回void(与update相同)。但除此之外,无论使用 saveupdatesaveOrUpate,在数据库中存储对象的内部代码都是相同的。

关于java - hibernate 更新而不是在保存后抛出预期错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26139347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com