给出的定义(为了简化省略IDS):在setter调用之后Hibernate是否会触发更新查询?
@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在冲洗( “非空属性引用null或瞬时值”) 。但是,如果我们将“a.setB(b)”替换为“b.setA(a)”,则不会引发异常。就好像“a.setB(b)”在“b.a”中使用null值触发sql更新,而不管下一个setter和update行如何。
我们之前没有收到过这种行为,它显然是从hibernate v3.6迁移到v4.3后开始的。 hibernate如何决定根据实体和会话中的实体状态更改或方法调用来生成sql更新?有没有可以设置的配置将其更改为以前的行为?
注意:这些语句被简化了,它们之间有更多的代码。
有一些自动刷新设置...我现在不记得,但每个DML查询后,我一直在做齐平。 – 2014-09-22 13:25:59
我的flushMode是AUTO。我试着改为COMMIT,但问题仍然存在。 – Vituel 2014-09-22 19:21:22
其实我已经在web.xml(http://stackoverflow.com/a/13362558/2004857)里面的“openSessionInViewFilter”中设置了flushMode,它没有工作。这一次,我在sessionFactory.getCurrentSession()之后以编程方式做了它,并且异常没有抛出。 – Vituel 2014-09-22 21:25:06