【问题标题】:Hibernate firing unnecessary update.why?休眠触发不必要的更新。为什么?
【发布时间】:2012-12-11 18:08:30
【问题描述】:

我有三层,即 Action、Service、DAO 层。我已经使用 id 为 123 的休眠从 DB 加载了一个对象(雇员类)。我对雇员对象进行了一些修改。后来,我创建了休眠业务对象并对其进行了一些修改。

Employee e = service.getEmp(123);
e.setName("Ashok");

Order o = new Order
o.setNumber(567);

service.saveOrUpdate(o);

在这种情况下,为什么它试图更新员工对象,即使我没有说要保存它?如何从会话中分离它?我不希望休眠更新员工对象。

【问题讨论】:

  • 您的订单类是否包含员工实例,是否设置为预加载?
  • “自然”的方式是不调用e.setName()。跟踪会话中对象的更改是 Hibernate 运行方式的基本部分。

标签: java hibernate evict


【解决方案1】:

在这种情况下,为什么它甚至试图更新员工对象 虽然我不是说要保存它?

我引用自hibernate docs

事务性持久实例(即加载、保存的对象, 由 Session 创建或查询)可以由 应用程序,并且对持久状态的任何更改都将被持久化 当 Session 被刷新时。 [...]。 无需调用特定方法(如 update(),它具有 不同的目的)使您的修改持久化。

还有

如何将其从会话中分离出来?

cascade="evict" 标记收藏。然后 Session.evict(Object) 刷新对象之前的对象(如果您有 FlushMode.AUTO 则可能将其设置为 MANUAL 直到您完成您想要的操作)。

【讨论】:

    猜你喜欢
    • 2014-12-13
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    相关资源
    最近更新 更多