Hibernate @Version与@Audited冲突(可能)

时间:2017-08-22 16:28:06

标签: java hibernate

我添加到我的实体

  

@Version       @Temporal(TemporalType.TIMESTAMP)
      @Column(name =“version”)
      私人日期版;

发生了一些奇怪的事情。当我更新时,hibernate告诉我密钥已经存在。 @version如何影响我的实体?我不知道为什么会这样。当我删除这个@version字段时一切正常。我也使用@Audited注释。

我的实体:

private static final long serialVersionUID = 1636824190907788517L;
@Id
@NotNull
@Column(name = "id")
private UUID id;
@Version
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "version")
private Date version;
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "user", nullable = false)
private User user;
@Column(name = "purpose", length = 100)
protected String comment;
@OneToOne(cascade = CascadeType.REMOVE)
@JoinColumn(name = "eq_id", nullable = false)
protected BasicEquipment equip;
@OneToOne(cascade = CascadeType.REMOVE)
@JoinColumn(name = "eq_id2", nullable = false)
protected BasicEquipment equip2;

错误:

  

引起:org.hibernate.exception.ConstraintViolationException:无法执行语句(...)       

org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(Standaorg.hibernate.engine.jdbc.sporg.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatch   org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTra   引起:org.postgresql.util.PSQLException:错误:重复键值违反唯一约束“pk_entity”

1 个答案:

答案 0 :(得分:0)

你试过这个解决方案吗?

http://www.byteslounge.com/tutorials/jpa-entity-versioning-version-and-optimistic-locking

  

在某些情况下,版本化更新时可能会出现问题   与批量更新一起使用。它发生在我身上   例如,过去使用给定版本的Oracle 11g和Hibernate。   Oracle JDBC驱动程序无法提取正确数量的   JDBC批处理语句执行中更新的行数。

     

如果您还遇到此问题,可以检查是否已设置   Hibernate属性hibernate.jdbc.batch_versioned_data为true。什么时候   这个设置是真的,Hibernate甚至会使用批量更新   针对版本化数据进行的更新,即。需要更新   使用更新的行计数以检查并发更新。   由于JDBC驱动程序可能无法返回正确的更新行数,   Hibernate将无法检测实际的并发更新   发生了。 Hibernate中此设置的默认值为false,因此   它在检测到版本化数据时不会使用批量更新   更新将在给定的刷新操作中执行。

     

这当然是Oracle 11g的一个特定场景,很容易   正如我们刚才看到的那样工作。