【问题标题】:use of update or saveorupdate method in hibernate在 hibernate 中使用 update 或 saveorupdate 方法
【发布时间】:2015-12-11 05:26:36
【问题描述】:

如果无论如何管理对象,它的状态将被跟踪,并且对该对象所做的任何更改都将作为脏检查的一部分在数据库中自动更新,那么为什么 updatesaveOrUpdate 方法是需要吗?

更新

如果我们尝试保存分离的对象并且该对象与会话相关联,为什么 update 和 saveOrUpdate 方法会抛出异常?

【问题讨论】:

    标签: hibernate orm


    【解决方案1】:

    为什么需要 update 或 saveOrUpdate 方法?

    您问题的第二部分回答了第一部分:这些方法用于更新 分离的对象,其状态 被 Hibernate 跟踪。

    如果我们尝试保存分离的对象并且该对象与会话相关联,为什么 update 和 saveOrUpdate 方法会抛出异常?

    因为 Hibernate 提供了一种保证(这对其自身的正确行为至关重要):在会话中,给定实体只能有一个实例。由于 update() 和 saveOrUpdate() 采用分离的实体并将其附加,如果会话中已经存在该实体的附加版本并且 Hibernate 没有抛出异常,您最终会得到两个相同的附加实例同一会话中的实体。因此,这将打破 Hibernate 保证。如果 user1 和 user2 是 ID 为 42 的 User 的两个附加实例会发生什么:

    user1.setName("Foo");
    user2.setName("Bar");
    

    现在您提交事务:用户的名称应该是什么?

    【讨论】:

    • 感谢您的回答,我还有一个疑问,为什么合并方法会在持久化实体的同时创建副本?
    • 允许保存分离实体的状态而不像 update() 那样抛出异常:通过将分离实体的状态复制到附加实体,从而保留唯一性保证。
    • 但是在瞬态实例的情况下,对象不存在于持久上下文中,那么为什么需要副本?
    • 还有一个是瞬态对象的merge方法有什么用?
    • 在瞬态实例的情况下,它不存在,但在持久实例的情况下,它们可以存在。主要用例是更新持久实体。要保存一个新的,persist() 更合适。
    猜你喜欢
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 2014-08-16
    相关资源
    最近更新 更多