如何在多个数据库(分布式系统)中保留相同的JPA实体?

时间:2009-06-02 17:11:04

标签: jpa persistence glassfish ejb-3.0 toplink

(如何)是否可以将JPA实体持久保存在多个服务器的数据库中,而无需将所有内容复制到DTO?

我们有一个分布式系统。某些应用程序确实有用于缓存目的的DB。 JPA Provider抛出一个异常,它抱怨它不能持久保存分离的对象。

但我想保留实体的ID,只需将其保留在这个额外的数据库中。

(JPA 1.2,EJB 3.0,Glassfish v2.1,Toplink Essentials)

1 个答案:

答案 0 :(得分:3)

不要em.persist(obj),只是em.merge(obj)。合并适用于附加和分离的对象。

如果您从一个分离的对象开始,我会将该对象与相应的EntityManagers合并。如果你试图在对象中保持身份密钥相同,我会从合并的第一个对象中提取密钥,并在将来使用它。

您可能(我不知道)不想做的是尝试合并由一个EM管理的对象与另一个EM。您可以测试一下它是否有效,我只是不知道如果您尝试会发生什么。

所以

YourEntity unattachedEntity = ... // your original entity object.

YourEntity managedEntity = em1.merge(unattachedEntity);

// managedEntity now has the primary key assigned by the DB
unattacheEntity.setPrimaryKey(managedEntity.getPrimaryKey());

em2.merge(unattachedEntity);
em3.merge(unattachedEntity);

这样的事情应该可行。