gpt4 book ai didi

java - JPA 最佳实践问题 - 仅更新一个字段

转载 作者:行者123 更新时间:2023-11-30 07:36:16 28 4
gpt4 key购买 nike

我的问题类似于

Updating one field in JPA entity

基本上我有一个实体 Foo,它有一些基本字段(enumStringDateTime),它还有两个其他字段。其中一个是 OneToOne,另一个是使用 Collection 实现的 OneToMany。

我有两个正在运行的线程,它们会在不同的时间使用 Singleton EntityManager 包装类上的 findById 类型方法查找同一个实体(我没有写这个;)

我想避免的是以下情况:

线程 1 查找 ID 为 1 的 Foo,并获得对 Foo 的引用以及 Foo 在该时间点的状态。

线程 2 查找一个 ID 为 1 的 Foo 并获得一个与线程 1 状态相同的 Foo 的引用

线程 1 更改 Foo 上的 String 字段并通过合并持久化它线程 2 更改了 foo 上 Enum 字段的值,并通过合并将其持久化

最后一个操作导致更改线程 1 被线程 2 获得的字符串字段的旧状态替换,因为合并正在更新所有内容(OneToOne 和 OneToMany 除外,因为它们的 CascadeType 是 Persist 和 Remove)。

我正在寻找的是关于在只需要以这种方式更新特定字段时防止这种状态破坏的最佳实践方法的建议。

虽然我有一个,我认为这是我帖子顶部的链接中提到的,但是改变了使用它现在使用的通用 save(Object o) 的东西它合并到特定于这种情况的东西,对从实体 ID 键入的特定字段执行更新。有没有更好的办法?我当前的持久性提供程序是 EclipseLink。

TIA

-NBW

最佳答案

您应该在 JPA 中使用乐观锁定 (@Version)。这将导致第二个客户的交易失败。

此外,EclipseLink 只会更新更改的字段,因此如果您将两个对象读入事务/持久性上下文,它们只会更新它们更改的字段。让它恢复更改的唯一方法是在读取对象后序列化或分离对象,然后合并回新的持久性上下文。 (请注意,merge() 仅适用于分离的对象,不应用于托管对象,因为它们已经被托管)。

关于java - JPA 最佳实践问题 - 仅更新一个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3687280/

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