【发布时间】: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