2011-08-25 49 views
0

我有一個實體A有3個屬性引用另一個實體B. 從關係POV,這很好,因爲我可能有3個不同的表B存儲爲不同的ID爲了提供進一步的說明,我的表A有3列稱爲manager_id,supervisor_id,worker_id。所有三欄都參考了員工表(表B)。 但是在JPA中,當實體管理器構建實體A(對應於表A)時,如果三個列中的多個具有相同的ID,則實體A將不具有實體B的單獨對象,但將指向相同參考。 (例如,如果manager_id和supervisor_id是'12345',那麼當建立實體A時,映射到manager_id和supervisor_id的字段將指向實體B的同一參考對象,其ID ='12345'EJB 3實體多列相同的對象引用問題

這是直到提交時間。每當我更改manager_id tp'67891',那麼supervisor_id也會與此id一起存儲,因爲它們指向相同的引用。 這是錯誤的。 如何配置框架以獲取單獨的引用對象屬性,而不管它們是否指向同一對象,或指定實體管理器僅保留已更改的字段? 我不想爲此編寫原生查詢。

任何意見將不勝感激!

+0

請告訴我們,運行「每當代碼我改變了manager_id tp'67891'「。我懷疑這是這個問題的關鍵部分。 –

回答

0

如果數據庫表的manager_id和supervisor_id列具有相同的值,則實體中的相應屬性將指向同一個對象。這是正常的,正確的,JPA行爲,並不是你可以或應該儘量避免的。

你說說改變manager_id的值。你最近怎麼樣?我相信你應該能夠更改對應的屬性引用的對象,並讓JPA正確更改數據庫中的值。

在代碼:

@Entity 
public class A { 
    @ManyToOne @Column(name="manager_id") 
    private B manager; 
    @ManyToOne @Column(name="supervisor_id") 
    private B supervisor; 
    @ManyToOne @Column(name="worker_id") 
    private B worker; 

    public void setManager(B manager) { 
     this.manager = manager; 
    } 
} 

A a; 
B b67891; 
a.setManager(b67891); 

要看到一個完整的,自包含的,例如這個,請參閱:

+0

我同意指向同一個對象的兩列。但是,如果我用一個新的,不同的對象執行a.setManager()並持續實體A,那麼經理,主管和工作人員都具有新的價值。這是問題所在。 – Jaizen

+0

我已經寫了一個小演示 - 請參閱鏈接末尾的代碼。它按我的預期工作,並且我看不到你描述的問題。我使用OpenJPA作爲提供者。您可能已經在您的提供商中遇到了一個錯誤,但我懷疑它更可能是您自己的代碼中存在一個錯誤,恐怕。 –

+0

這是一個錯誤。正確的錢。對不起,浪費你的時間。雖然欣賞幫助! – Jaizen