我有2個物體連接在一起的定義是這樣的:的EclipseLink合併未能生成UPDATE語句更改值
public class A {
...
@Id
@Column(name = "A_ID")
@SequenceGenerator(...)
@GeneratedValue(...)
public Long getA_ID();
@OneToOne(mappedBy = "a", fetch = FetchType.LAZY, cascade = CascadeType.ALL, targetEntity = B.class)
public B getB();
...
}
@VirtualAccessMethods(get = "getMethod", set = "setMethod")
public class B {
...
@Id
public Long getA_ID();
@MapsId
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL ,targetEntity = A.class)
@JoinColumn(name="A_ID")
public A getA();
getMethod(String name);
setMethod(String name, Object value);
...
}
當我去em.merge(A)
爲B加入到一種用於INSERT
,一切工作正常。但是如果我的更新做同樣的事情,這將只更新A.更新邏輯是,像這樣:
@Transactional
public void update(Object fieldOnANewValue, Object fieldOnBNewField) {
A objA = em.executeQuery(...) //loads objA by primary key
objA.setFieldOnA(fieldOnANewValue);
B objB = objA.getB(); //lazy loads objB
objB.setMethod("FieldOnB", fieldOnBNewValue);
}
如果我查看日誌,有一個SQL UPDATE
聲明,承諾我對所做的更改A,但對B沒有任何幫助。如果我手動撥打em.merge(objB)
存在同樣的問題。有沒有人知道EclipseLink究竟是用來確定是否生成UPDATE
聲明?特別是關於@VirtualAccessMethods
?但是,我有@OneToOne映射設置不同之前和em.merge(objB)
工作正常,再加上INSERT
工程,所以我不知道是否這是問題。另一方面,如果我有另一個也加入到A的對象,但只是像A這樣的普通POJO,則會爲此生成UPDATE
語句。緩存已關閉,並且我已驗證在調用合併之前對象已正確更新。
合併操作甚至不應該有必要的,因爲A和B連接。對它們所做的任何更改應該在清空時以透明方式寫入數據庫。合併必須用於合併* detached *實體狀態到* attached *之一。合併已經連接的實例是不必要的。 – 2012-02-08 21:13:38
刪除'em.merge()'調用會導致與生成A的'UPDATE'相同的問題,而不是B. – Trisfall 2012-02-09 13:10:33
問題必須在'//將updatedInfoA複製到objA'後面。告訴我們這個代碼。 – 2012-02-09 13:17:14