2012-10-04 65 views
3

是否有任何特定的配置可以將來自不同持久單元的實體放入當前映射?來自不同持久單元的JPA實體映射

例如:

@RooJpaActiveRecord(persistenceUnit = "persistenceUnit_central") 
public class UserGroups{ 

    //users come from `persistenceUnit_client` 
    //how to work this out? 
    //can mappedBy and targetEntity works the same way 
    //as they are in the same persistence unit? 
    @OneToMany 
    private List<User> users; 
} 

預先感謝。

回答

1

我不認爲你不能直接做到這一點。堅持單位意味着明顯分開;他們有不同的實體經理,所以他們很可能(並且這通常是原因)來自不同的數據庫或模式。

您仍然可以在幾個持久性單元中定義相同的實體類,在persistence.xml中,但正如我所說,它將由每個管理器分別處理。這意味着你不能做到這一點:

UserGroups ug = em1.find(UserGroups.class, ...); // entity manager 1 
User u = em2.find(User.class, ...); // entity manager 2 

// exception will be thrown on commit 
// - from the point of view of em1, "u" is detached 
ug.getUsers().add(u); 

我不知道,如果在調用em1.merge(u)會解決,我還沒有碰到過這樣的情況的問題—。但是,您肯定可以創建User的副本並將其合併到所需的持久性上下文中。

+0

感謝您的反饋。然後,我認爲將'User'實體放入'UserGroups'沒有任何意義,因爲只是中斷之間的關係映射,因此setter/getters不再方便。然後,我可能會使用列表 userId,然後必須添加額外的代碼來手動實現映射,我知道這不是好的做法。我們可以有更好的選擇嗎? – Dreamer

+1

我不會放棄直接使用'User',不需要犧牲正確的設計。您可以在兩個持久性單元中擁有User,只有您不能將**對象**從一個單元的上下文分配給另一個單元。 – MaDa

+0

謝謝你的建議。對於遲到的反饋抱歉。 :) – Dreamer

0

馬達是正確的。我對這個問題做出了回答,只是爲了解決這個問題。

首先,我們到目前爲止我們不能堅持實體B中的實體A的實例,而A和B來自不同的持久單元。 使其正常工作的安全方法是使實體A的實例變爲@Transient,然後永遠不會做出更改以使該實例與數據庫綁定。但是,手動建立實體(setter和getter)之間的關係會有點痛苦,這成爲一個懸而未決的問題。

再次感謝馬達。