从分离的实体更新数据库的正确方法是什么?

时间:2014-04-18 19:57:05

标签: java jpa-2.0

我的设置涉及glassfish4和objectDB,但我相信我的问题是普通的JPA。

假设您有一个将实体作为参数的函数。此实体已分离但保留实体的最新状态。 (这可能是某人通过gui更新了实体的值,或者您从另一个系统获得了最新数据。)

目标是将这些新数据存储在数据库中。您不想简单地添加此实体(即因为某些唯一约束会惩罚此实体),但您想要更新存储在数据库中的旧版本实体。

你是怎么做到的?

我的一个想法是从数据库实例中检索ID和版本,将它们复制到分离的实例中,然后合并此实例。

MyEntity storedEntity = myEntityDao.findEntityFor(newEntity);
newEntity.setId(storedEntity.getId());
newEntity.setVersion(storedEntity.getVersion());
MyEntity mergedEntity = em.merge(newEntity);

但版本字段不正确。 (ObjectDB会抛出一个OptimisticLockException,无论我在分配期间是否向版本添加+1或+5。)

1 个答案:

答案 0 :(得分:1)

正确的方法是确保存储实体的ID和版本在往返应用程序的其他部分期间从未更改过。

然后取出那个分离的storedEntity,并在其上调用merge:

YourEntity attachedEntity = entityManager.merge(storedEntity);

您可以使用附加的实体引用而不是原始的storedEntity分离副本,在附件后对实体进行进一步更改。

一般情况下,应用程序不应修改版本字段,Hibernate将处理此问题。这个字段最多可以在实体和DTO之间复制。