【问题标题】:Does Hibernate fire an update query after a setter call?在 setter 调用之后,Hibernate 会触发更新查询吗?
【发布时间】:2014-09-22 13:17:00
【问题描述】:

给定定义(为简单起见省略了 ID):

@Entity
class A {
   @OneToMany(mappedBy="a", cascade=CascadeType.ALL)
   B b;
}

@Entity    
class B {
   @ManyToOne
   @JoinColumn(nullable=false)
   A a;
}

还有语句:

a.setB(b);
b.setA(a);
session.update(a);
session.flush();

我们在刷新中得到 PropertyValueException(“非空属性引用空值或瞬态值”)。但是,如果我们将“a.setB(b)”与“b.setA(a)”交换,则不会引发异常。就好像“a.setB(b)”正在使用“b.a”中的空值触发 sql 更新,而不管下一个 setter 和 update 行如何。

我们之前没有遇到这种行为,它显然是在从 hibernate v3.6 迁移到 v4.3 之后开始的。 hibernate是如何根据实体状态变化或者实体和会话中的方法调用来决定生成sql更新的呢?是否可以设置配置以将其更改为以前的行为?

注意:这些语句是简化的,它们之间还有更多代码。

【问题讨论】:

  • 有一些自动刷新设置...我现在不记得了,但我总是在每次 DML 查询后进行刷新。
  • 我的flushMode是AUTO。我尝试更改为 COMMIT,但问题仍然存在。
  • 实际上我在 web.xml (stackoverflow.com/a/13362558/2004857) 内的“openSessionInViewFilter”中设置了flushMode,但没有成功。这次我是在 sessionFactory.getCurrentSession() 之后以编程方式完成的,并且没有抛出异常。

标签: hibernate


【解决方案1】:

Hibernate 不会在 setter 本身之后而是在刷新之后触发查询。

在我的情况下,“a.setB(b)”之后的读取操作触发了刷新(而实体处于不一致状态:b.a == null),因为我在休眠中将 flushMode 设置为 AUTO。

我有两种修复方法:

  1. 当状态一致时,将读取操作移动到“b.setA(a)”之后; 或
  2. 将 flushMode 设置为 COMMIT。 Note that you now have to manually flush before every db operation involving entities updated earlier in the same transaction or you might get stale data.

    Session session = sessionFactory.getCurrentSession();
    session.setFlushMode(FlushMode.COMMIT);
    

【讨论】:

  • 我想了解您是如何解决这个问题的,A 和 B 之间有什么样的关系?是一对一吗?您在In my case a flush was being triggered by a find afterMoving the find to after 的回答中使用find 一词是什么意思,并且`请注意,您现在必须在每次查找之前手动刷新`?因为休眠会话界面中没有 find 方法。在这种情况下,陈旧的数据是如何出现的?你能详细说明一下吗?
  • 你完全正确。我已经添加了定义关系的注释,现在它会更有意义。 “查找”是指“读取操作”。关于 flushMode 和陈旧数据,我认为这很好地解释了这一点:stackoverflow.com/a/7222097/2004857。感谢您指出这些事情。
【解决方案2】:

我认为你得到这个是因为“或 transient 价值”。确保您从数据库中正确获取了 B 的实例,或者您告诉 Hibernate 也将其保存(通过显式调用 persist()/update())或通过创建级联关系

【讨论】:

    猜你喜欢
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    相关资源
    最近更新 更多