2012-02-08 41 views
0

我有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語句。緩存已關閉,並且我已驗證在調用合併之前對象已正確更新。

+0

合併操作甚至不應該有必要的,因爲A和B連接。對它們所做的任何更改應該在清空時以透明方式寫入數據庫。合併必須用於合併* detached *實體狀態到* attached *之一。合併已經連接的實例是不必要的。 – 2012-02-08 21:13:38

+0

刪除'em.merge()'調用會導致與生成A的'UPDATE'相同的問題,而不是B. – Trisfall 2012-02-09 13:10:33

+0

問題必須在'//將updatedInfoA複製到objA'後面。告訴我們這個代碼。 – 2012-02-09 13:17:14

回答

3

請顯示完整的代碼和映射。

鑑於您正在使用虛擬訪問(您是否正確使用此功能?),它可能是某種與虛擬訪問有關的更改跟蹤問題。沒有使用虛擬訪問是否會發生問題?

嘗試設置,

@ChangeTracking(ChangeTrackingType.DEFERRED)

,看看是否有一個影響。

您也可以嘗試,

@InstantiationCopyPolicy

+0

我不知道虛擬訪問是否正確使用。由於事實上,如果我添加對象C和D,其中C是一個正常的POJO和D是像B一樣的虛擬訪問,C可以工作,但B和D不會,所以我相當確定問題與更改有關跟蹤虛擬訪問。我現在會嘗試這些建議。 – Trisfall 2012-02-09 14:05:00

+0

@ChangeTracking(ChangeTrackingType.DEFERRED)爲具有虛擬訪問權限的對象生成更新語句。非常感謝詹姆斯! – Trisfall 2012-02-09 14:10:42