我的设置涉及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。)
答案 0 :(得分:1)
正确的方法是确保存储实体的ID和版本在往返应用程序的其他部分期间从未更改过。
然后取出那个分离的storedEntity,并在其上调用merge:
YourEntity attachedEntity = entityManager.merge(storedEntity);
您可以使用附加的实体引用而不是原始的storedEntity分离副本,在附件后对实体进行进一步更改。
一般情况下,应用程序不应修改版本字段,Hibernate将处理此问题。这个字段最多可以在实体和DTO之间复制。