[英]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.