【问题标题】:Table with composite primary key and version field in JPAJPA中具有复合主键和版本字段的表
【发布时间】:2026-01-26 11:30:01
【问题描述】:

我尝试对此使用@IdClass 并在版本字段上使用常规@Version 注释,但我不断收到错误:

OptimisticLockException:试图将已删除的实例类型“class xxx”附加到 oid“xxx”。如果实例是新的,则版本字段应保留其默认值

在 EntityManager.merge(obj) 行之后。 我有两个整数 PK,版本字段也是如此...... 我使用一个 PK-Class,它的 Id 字段带有 @IdClass(Pk.class),并且 Id 的 setter 和 getter 正在调用在构造函数中创建的 Pk 类的实例。 我没有使用@GeneratedId。 我使用的是 Openjpa 而不是 Hibernate。

【问题讨论】:

  • 发布实际类和用于获取错误消息的代码。没有它就很难理解你在做什么......

标签: java jpa openjpa jpa-2.1


【解决方案1】:

可能是您的应用。正在更改版本字段。它不应该被设置。这是一个技术专栏。此处不粘贴代码,只是猜测。

【讨论】:

  • 版本的设置器受保护...也尝试了私有。我在合并后得到这个。
  • 如果你得到一个乐观锁定异常,这意味着其他一些事务已经对你试图更新/删除的实体提交了更改。
  • 我发现虽然版本的设置器是私有的,但在类本身中有一个用于 setVersion 的调用。感谢您指引正确的方向。