我添加到我的实体
发生了一些奇怪的事情。当我更新时,hibernate告诉我密钥已经存在。 @version如何影响我的实体?我不知道为什么会这样。当我删除这个@version字段时一切正常。我也使用@Audited注释。@Version @Temporal(TemporalType.TIMESTAMP)
@Column(name =“version”)
私人日期版;
我的实体:
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”
答案 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的一个特定场景,很容易 正如我们刚才看到的那样工作。