Java 从分离实体更新数据库的正确方法是什么?
我的设置涉及glassfish4和objectDB,但我相信我的问题是通用JPA 假设您使用一个函数,该函数获取一个实体作为参数。此实体已分离,但保留实体的最新状态。(这可能是指某人通过gui更新了实体的值,或者您从另一个系统获取了最新数据。) 目标是将这些新数据存储在数据库中。您不想简单地添加此实体(即,因为某些独特的约束会惩罚此实体),但希望更新存储在数据库中的实体的旧版本 您是如何做到这一点的? 我的一个想法是从DB实例中检索ID和版本,将它们复制到分离的实例中,然后合并这个实例Java 从分离实体更新数据库的正确方法是什么?,java,jpa-2.0,Java,Jpa 2.0,我的设置涉及glassfish4和objectDB,但我相信我的问题是通用JPA 假设您使用一个函数,该函数获取一个实体作为参数。此实体已分离,但保留实体的最新状态。(这可能是指某人通过gui更新了实体的值,或者您从另一个系统获取了最新数据。) 目标是将这些新数据存储在数据库中。您不想简单地添加此实体(即,因为某些独特的约束会惩罚此实体),但希望更新存储在数据库中的实体的旧版本 您是如何做到这一点的? 我的一个想法是从DB实例中检索ID和版本,将它们复制到分离的实例中,然后合并这个实例 MyEn
MyEntity storedEntity = myEntityDao.findEntityFor(newEntity);
newEntity.setId(storedEntity.getId());
newEntity.setVersion(storedEntity.getVersion());
MyEntity mergedEntity = em.merge(newEntity);
但是版本字段不正确。(ObjectDB抛出OptimisticLockException,无论我在分配过程中是否向版本添加+1或+5)。正确的方法是确保存储实体的Id和版本在往返到应用程序的其他部分时从未更改 然后获取分离的storedEntity,并对其调用merge:
YourEntity attachedEntity = entityManager.merge(storedEntity);
通过使用附加的实体引用,而不是原始的StoreIdentity分离副本,可以在附加后对实体进行进一步更改
一般来说,应用程序不应修改版本字段,Hibernate将处理此问题。最多可以在实体和DTO之间复制此字段。我更新了示例/伪代码,以显示“storedEntity”是新从数据库中检索到的。所以版本应该是最新的。我想因为使用分层事务,我在实体状态中迷失了方向。所以基本上你的答案是正确的。