【问题标题】:JPA entity mapping from different persistent unit来自不同持久单元的 JPA 实体映射
【发布时间】:2012-09-25 17:21:51
【问题描述】:

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

例如:

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

提前致谢。

【问题讨论】:

    标签: java spring jpa ejb


    【解决方案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 的副本并将其合并到所需的持久性上下文中。

    【讨论】:

    • 感谢您的反馈。然后我认为将User 实体放入UserGroups 没有任何意义,因为刚刚中断之间的关系映射,因此设置器/获取器不再方便。然后我可能使用 List userId 代替,然后必须添加额外的代码来手动实现映射,我知道这不是一个好习惯。我们能有更好的选择吗?
    • 我不会放弃直接使用User,没有必要牺牲适当的设计。您可以在两个持久性单元中拥有 User,只是您不能将 object 从一个单元的上下文分配给另一个单元。
    • 感谢您的建议。很抱歉迟到的反馈。 :)
    【解决方案2】:

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

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

    再次感谢马达。

    【讨论】:

      猜你喜欢
      • 2013-04-18
      • 1970-01-01
      • 2018-04-30
      • 2013-04-17
      • 2011-07-13
      • 1970-01-01
      • 2019-06-17
      • 1970-01-01
      • 2011-09-22
      相关资源
      最近更新 更多