JPA实体映射来自不同的持久单元

时间:2012-10-04 16:01:42

标签: java spring jpa ejb

是否有任何特定配置将实体从不同的持久性单元放入当前映射?

例如:

@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;
}

提前致谢。

2 个答案:

答案 0 :(得分: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的副本并将其合并到所需的持久化上下文中。

答案 1 :(得分:0)

MaDa是对的。我对这个问题做出了这个答案,只是为了解决这个问题。

首先,我们到目前为止,我们不能在实体B中保持实体A的实例,而A和B来自不同的持久性单元。 使其正常工作的一种安全方法是使实体A的实例变为@Transient,然后永远不会进行更改以使该实例与数据库绑定。但是,手动设置实体(setter和getter)之间的关系会有点痛苦,这会成为一个悬而未决的问题。

再次感谢Mada。