Sping Boot JPA @Version和@Transactional不能一起工作

bvjxkvbb  于 2023-10-20  发布在  Spring
关注(0)|答案(1)|浏览(127)

我正在使用Spring JPA + Hibernate,并且在我的一个实体上添加了一个版本列,以确保多用户更新支持。实体have是一个带有@Version注解的Long
现在,在我的服务中,我注入了一个标准的JpaRepository,我需要用@Transactional注解服务类,以用于另一个用例,但是仅仅在我的服务上添加transactional注解就会破坏版本处理。现在我可以给予任何值给version字段,JPA将在保存之前自动设置正确的值,因此当试图从客户端使用错误的版本值进行更新时不会显示冲突错误。
我找不到任何关于这方面的文档-为什么仅仅将@Transactional添加到服务类就应该更改@Version逻辑?

@Entity
@Table(name="tbl")
public class SomeEntity {
    @Id
    private Long id;
    @Version
    private Long rowVersion;
    private String value;
}
@Repository
public interface SomeEntityRepository extends JpaRepository<SomeEntity, Long> {}
@Service
@Transactional
public class SomeService {
    private final SomeEntityRepository rep;

    public void update(Long id, Long rowVersion, String value) {
        var entity = rep.findById(id).get();
        entity.setValue(value);
        entity.setRowVersion(rowVersion);
        rep.save(entity);
    }
}
dsekswqp

dsekswqp1#

对于这种简单的场景,您不应该手动更新版本字段。关于version-column的正确用法,请参见此处:https://vladmihalcea.com/jpa-entity-version-property-hibernate/
完全删除行entity.setRowVersion(rowVersion);。如果你想检查一个用户是否有一行的最新版本,你可以检查数据库的版本号是否与预期相符,但你不应该设置它,因为hibernate会在它生成的update-statements中附加递增的版本号。

相关问题