Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从分离实体更新数据库的正确方法是什么?_Java_Jpa 2.0 - Fatal编程技术网

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

Java 从分离实体更新数据库的正确方法是什么?,java,jpa-2.0,Java,Jpa 2.0,我的设置涉及glassfish4和objectDB,但我相信我的问题是通用JPA 假设您使用一个函数,该函数获取一个实体作为参数。此实体已分离,但保留实体的最新状态。(这可能是指某人通过gui更新了实体的值,或者您从另一个系统获取了最新数据。) 目标是将这些新数据存储在数据库中。您不想简单地添加此实体(即,因为某些独特的约束会惩罚此实体),但希望更新存储在数据库中的实体的旧版本 您是如何做到这一点的? 我的一个想法是从DB实例中检索ID和版本,将它们复制到分离的实例中,然后合并这个实例 MyEn

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

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

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

您是如何做到这一点的?

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

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”是新从数据库中检索到的。所以版本应该是最新的。我想因为使用分层事务,我在实体状态中迷失了方向。所以基本上你的答案是正确的。