我的代码运行良好,但不应该根据我对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,如果它改变了什么......
答案 0 :(得分:1)
如果您查看Session.save
方法的javadoc,您会看到它会讨论瞬态实例。这意味着非休眠管理实体。当您执行Session.getById
检索对象时,它是非 - 瞬态实例。
如果你要使用一个瞬态实例,它确实会引发一个异常,说明具有给定标识符的对象已经存在。但是,由于这已经是托管实例,因此会检测到这个实例,而不是保存更新。
要测试这个,只需创建一个要保存的配置文件的新实例,给它一个已经存在于数据库中的ID并尝试存储它。
另一方面,因为它已经是一个托管的内容,你甚至不需要调用save
来保持更改,这些更改将自动与数据库同步。
save
和saveOrUpdate
之间的主要区别在于返回类型。使用save
时,会返回新创建的ID saveOrUpdate
,返回void
(update
也一样)。但除此之外,无论使用save
,update
还是saveOrUpate
,用于在数据库中存储对象的内部代码都是相同的。