【发布时间】:2010-09-10 18:30:07
【问题描述】:
我的问题类似于
Updating one field in JPA entity
基本上我有一个实体 Foo,它有一些基本字段(enum、String、DateTime),它还有另外两个字段。其中一个是 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 获得的 String 字段的旧状态替换,因为合并正在更新所有内容(OneToOne 和 OneToMany 除外,因为它们的 CascadeType 是 Persist 和 Remove)。
我正在寻找的是关于当人们只需要以这种方式更新特定字段时防止这种状态破坏的最佳实践方法的建议。
虽然我有一个,我认为这是我帖子顶部的链接中提到的,是改变使用它现在使用的通用 save(Object o) 的东西,它合并到特定的东西对于这种情况,它对从实体 ID 键入的特定字段执行 UPDATE。有没有更好的办法?我当前的持久性提供程序是 EclipseLink。
TIA
-NBW
【问题讨论】:
-
参考答案here看JPA 2.1支持部分实体更新
标签: java jpa eclipselink