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

时间:2014-10-01 10:33:00

标签: java spring hibernate

我的代码运行良好,但不应该根据我对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,如果它改变了什么......

1 个答案:

答案 0 :(得分:1)

如果您查看Session.save方法的javadoc,您会看到它会讨论瞬态实例。这意味着非休眠管理实体。当您执行Session.getById检索对象时,它是 - 瞬态实例。

如果你要使用一个瞬态实例,它确实会引发一个异常,说明具有给定标识符的对象已经存在。但是,由于这已经是托管实例,因此会检测到这个实例,而不是保存更新。

要测试这个,只需创建一个要保存的配置文件的新实例,给它一个已经存在于数据库中的ID并尝试存储它。

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

savesaveOrUpdate之间的主要区别在于返回类型。使用save时,会返回新创建的ID saveOrUpdate,返回voidupdate也一样)。但除此之外,无论使用saveupdate还是saveOrUpate,用于在数据库中存储对象的内部代码都是相同的。