2017-08-22 7 views
0

。私が更新すると、hibernateはそのキーがすでに存在していることを伝えます。どのように@versionファイルが私のエンティティに影響を与えますか?なぜ起こったのか分かりません。このバージョンのフィールドを削除すると、すべてが動作します。 @Audited注釈も使用します。休止@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; 

エラー:

Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement (...)

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 Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "pk_entity"

+0

は少し言うようなものです「運転中、私は私の車の後部に到達することはできませんが、私はシートベルトを削除すると、すべてが機能します」 。症状と戦って、原因と戦わないでください。 –

答えて

0

あなたは、このソリューションを試してみましたか? 「私は@Versionを削除するとすべての作品」と言っ

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

Under some circumstances, problems may occur when versioned updates are used together with batch updates. It has happened to me in the past with a given version of Oracle 11g and Hibernate, for example. The Oracle JDBC driver was not able to extract the correct number of updated rows count in JDBC batch statements execution.

If you are also facing this problem, you may check if you have set the Hibernate property hibernate.jdbc.batch_versioned_data to true. When this setting is true, Hibernate will use batch updates even for updates that are made against versioned data, ie. updates that need to use the updated rows count in order to check for concurrent updates. Since the JDBC driver may not return the correct updated rows count, Hibernate will not be able to detect if concurrent updates actually happened. The default value for this setting in Hibernate is false, so it will not use batch updates when it detects that versioned data updates are going to be executed in a given flush operation.

This is of course a specific scenario with Oracle 11g that is easily worked around, as we have just seen.

+0

私は休止状態の追加プロパティを設定しましたが、それは動作しません。今私は重複したキーとwasnyのエラーがあると思いますが、監査されたバージョンとの間の衝突は...そしてまだ私は重複するキーについて同じエラーがあります –