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

Java 来自不同持久化单元的JPA实体映射,java,spring,jpa,ejb,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 sam

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

例如:

@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;
}
@RooJpaActiveRecord(persistenceUnit=“persistenceUnit\u central”)
公共类用户组{
//用户来自“persistenceUnit\u客户端”`
//如何解决这个问题?
//mappedBy和targetEntity能否以同样的方式工作
//因为它们在同一个持久性单元中?
@独身癖
私人名单用户;
}

提前谢谢。

我认为你不能直接做到这一点。持久性单位意味着明显分开;它们有不同的实体管理器,因此它们可能来自不同的数据库或模式(这通常就是原因)

您仍然可以在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
的副本,并将其合并到所需的持久性上下文中。

MaDa是正确的。我对这个问题的回答只是为了强调这个问题的解决方案

首先,到目前为止,我们无法在实体B中持久化实体A的实例,而A和B来自不同的持久化单元。 使其正常工作的一种安全方法是使实体A的实例变成@Transient,这样就永远不会有更改使该实例与数据库关联。但是,手动设置实体(setter和getter)之间的关系会有点困难,这将成为一个悬而未决的问题


再次感谢Mada。

感谢您的反馈。然后我认为将
User
实体放入
UserGroups
没有任何意义,因为两者之间的关系映射刚刚中断,因此setter/getter不再方便。然后我可能会使用List userId,然后不得不添加额外的代码来手动实现映射,我知道这不是一个好的实践。我们能有更好的选择吗?我不会放弃直接使用
User
,没有必要牺牲正确的设计。您可以将
User
分为两个持久化单元,但您不能将对象从一个单元的上下文分配到另一个单元。谢谢您的建议。抱歉,反馈太晚。:)