【发布时间】:2015-12-11 05:26:36
【问题描述】:
如果无论如何管理对象,它的状态将被跟踪,并且对该对象所做的任何更改都将作为脏检查的一部分在数据库中自动更新,那么为什么 update 或 saveOrUpdate 方法是需要吗?
更新
如果我们尝试保存分离的对象并且该对象与会话相关联,为什么 update 和 saveOrUpdate 方法会抛出异常?
【问题讨论】:
如果无论如何管理对象,它的状态将被跟踪,并且对该对象所做的任何更改都将作为脏检查的一部分在数据库中自动更新,那么为什么 update 或 saveOrUpdate 方法是需要吗?
如果我们尝试保存分离的对象并且该对象与会话相关联,为什么 update 和 saveOrUpdate 方法会抛出异常?
【问题讨论】:
为什么需要 update 或 saveOrUpdate 方法?
您问题的第二部分回答了第一部分:这些方法用于更新 分离的对象,其状态 不被 Hibernate 跟踪。
如果我们尝试保存分离的对象并且该对象与会话相关联,为什么 update 和 saveOrUpdate 方法会抛出异常?
因为 Hibernate 提供了一种保证(这对其自身的正确行为至关重要):在会话中,给定实体只能有一个实例。由于 update() 和 saveOrUpdate() 采用分离的实体并将其附加,如果会话中已经存在该实体的附加版本并且 Hibernate 没有抛出异常,您最终会得到两个相同的附加实例同一会话中的实体。因此,这将打破 Hibernate 保证。如果 user1 和 user2 是 ID 为 42 的 User 的两个附加实例会发生什么:
user1.setName("Foo");
user2.setName("Bar");
现在您提交事务:用户的名称应该是什么?
【讨论】: