gpt4 book ai didi

java - 从独立实体更新数据库的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-01 13:07:29 25 4
gpt4 key购买 nike

我的设置涉及 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。)

最佳答案

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

然后获取分离的存储实体,并对其调用合并:

YourEntity attachedEntity = entityManager.merge(storedEntity);

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

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

关于java - 从独立实体更新数据库的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23161328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com