給出的定義(爲了簡化省略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