Java 组合弹簧&x27;使用Hibernate@Generated(GenerationTime.ALWAYS)进行JPA版本控制的s JPA Auditor会导致中断的更新查询

Java 组合弹簧&x27;使用Hibernate@Generated(GenerationTime.ALWAYS)进行JPA版本控制的s JPA Auditor会导致中断的更新查询,java,spring,hibernate,Java,Spring,Hibernate,作为参考,这是一个示例实体: @Entity @Table(name = "example") @EntityListeners(AuditingEntityListener.class) public class Example { @Id @Column(name = "rep_firm_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; @Column(name = "cre

作为参考,这是一个示例实体:

@Entity
@Table(name = "example")
@EntityListeners(AuditingEntityListener.class)
public class Example {
  @Id
  @Column(name = "rep_firm_id")
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private int id;

  @Column(name = "created_time", nullable = false, updatable = false)
  @CreatedDate
  private OffsetDateTime createdTime;

  @Column(name = "modified_time")
  @LastModifiedDate
  private OffsetDateTime modifiedTime;

  @Column(name = "xmin")
  @Version
  @Generated(GenerationTime.ALWAYS)
  private int version;
}
如果我注释掉@EntityListeners注释,那么version属性将按预期工作,即更新查询具有以下内容:更新示例集foo=bla,其中xmin=version

如果我注释掉@Version注释,那么更新查询没有WHERE xmin=Version,但是它们有更新示例集foo bla,modified_time=time

如果我把这两个结合起来,我会有一种非常奇怪的行为,我还没有找到原因:

更新示例集foo-bla,修改_-time=time,其中xmin=versionPlusOne

本质上,它在WHERE子句上使用“下一个版本”而不是“上一个版本”,但只有在实体上启用了审核时才使用


有什么想法吗

我想它与你的注释有关。我在文件上看到GenerationTime.ALWAYS在插入和更新时都会更新实体。对于GenerationTime.ALWAYS,属性不应是可插入和可更新的。同时,您使用@Version,它将在每次更改时更新。如果我删除实体侦听器,它可以正常工作,也就是说,update子句在WHERE xmin=?中有“previous Version”,但在实体侦听器中,它在WHERE xmin=?中有“next Version”?(这会导致ObjectOptimisticLockingFailureException异常,因为没有行要用“下一个版本”更新)