You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hibernate OGM加@Version删除MongoDB实体仅保留_id字段问题

问题成因

这个现象是Hibernate OGM针对带@Version乐观锁注解的实体执行删除时的实现逻辑导致的:

  1. Apache Deltaspike Data的attachAndRemove方法会先将传入的脱管实体合并(merge)到持久化上下文,再执行删除操作。
  2. 带@Version注解的实体删除需要做乐观锁校验,旧版本Hibernate OGM的MongoDB方言实现中,为了校验版本号是否匹配,会先生成一条updateOne语句:
    • 执行条件为_id = 实体ID and version = 实体当前版本号
    • 执行内容是清空文档所有非_id字段,同时将版本号+1,用来完成乐观锁的冲突校验
    • 该版本的实现存在缺陷,更新校验完成后没有生成后续的deleteOne语句执行实际的文档删除,最终就只剩只带_id的空文档。
  3. 去掉@Version注解后,不需要做乐观锁校验,Hibernate OGM会直接生成按_id删除的deleteOne语句,文档会被完整移除。

解决方案

  • 优先升级Hibernate OGM到最新稳定版,该bug在后续迭代中已经被修复。
  • 如果无法升级版本,可以自定义Repository删除逻辑:
    1. 直接编写JPQL批量删除语句:DELETE FROM MyEntity e WHERE e.id = :id,这类语句会绕过乐观锁校验直接生成删除命令。
    2. 删除前先按ID查询出托管状态的实体,再调用remove方法执行删除,也可以规避该问题。

内容的提问来源于stack exchange,提问作者kem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 16:45:02