繁体   English   中英

JPA @Version 尝试删除实体时软删除不起作用

[英]JPA @Version Soft delete does not work when attempting to a deleted entity

我对乐观锁定有疑问。 我有一个 class 有一个 @Version 注释字段 + 软删除

@Entity
@Table(name = "units_locks")
@SQLDelete(sql = "UPDATE units_locks SET active=false WHERE id=?")
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@Audited
public class LockDbEntity {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(unique = true, nullable = false)
  protected Long id;

  @Version
  @Column(name = "entity_version")
  private long entityVersion;

  @Column(nullable = false)
  private Boolean active;
}

当我尝试删除实体时,Hibernite 抛出以下异常:

lockDbRepository.deleteAll(unitLockDbEntities);

乐观锁定失败; 嵌套异常是 org.hibernate.StaleObjectStateException:行已被另一个事务更新或删除。

有趣的是,如果我使用本机查询,该机制就可以工作,

  @Modifying
  @Query(value = "UPDATE units_locks SET active=false WHERE unit_id IN (:ids)", nativeQuery = true)
  void deleteAllNativeQuery(@Param("ids") List<Long> ids);

但这将迫使我对代码进行相当多的更改,这就是我要解决上述问题的原因。

我正在使用 Hibernate 5.6.2 版本

如果同时更改了行/对象,则会出现此异常。 使用本机查询只会跳过乐观锁检查。

但是您必须问自己,即使同时更改了行/对象,删除该行/对象是否合法? 也许您的代码中有逻辑,仅在 object 未使用时才允许删除,这现在可能会被违反。

阅读一下乐观锁定以了解此机制的目的是什么: https://www.baeldung.com/jpa-optimistic-locking

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM