私は以下のEntity-Snippedを持っています
@Entity
public class EntityWithNaturalId extends BaseEntity {
@NaturalId public String name;
private EntityWithNaturalId() {}
public EntityWithNaturalId(String name) { this.name = name; }
}
同じ名前のエンティティを 2 回永続化しようとすると、次のエラーが発生します (予想どおり)。
org.hibernate.exception.ConstraintViolationException: could not execute statement
Eindeutiger Index oder Primärschlüssel verletzt:
"_UNIQUEKEY_INDEX_6 ON PUBLIC.ENTITYWITHNATURALID(NAME) VALUES ('AA', 1)"
Unique index or primary key violation:
"_UNIQUEKEY_INDEX_6 ON PUBLIC.ENTITYWITHNATURALID(NAME) VALUES ('AA', 1)"
驚いたことに、データベースのテーブル制約を見ても、何も表示されません。一意の制約があってはいけませんか?
Postgres 9.3.2 休止状態 4.2.0
編集:状況を単純化するために事実を減らしたという事実により、この投稿は誤解を招く可能性があります. これを行うことで、この投稿に一貫性がなくなりました!!
@Vladは正しかったのですが、問題は別の場所にあることに気付きました。
私が書き忘れたのは、@NaturalId を使用するエンティティが他にもいくつかあるということです。Hibernate は、_UNIQUEKEY という名前のすべての制約を作成しようとします。(接頭辞がありません)
実際に作成されるのは最初の 1 つだけです。他のすべてのものはこの例外をスローします:
2014-11-10 13:18:10 ERROR org.hibernate.tool.hbm2ddl.SchemaExport - HHH000389: Unsuccessful: alter table AnotherEntityWithNaturalId add constraint _UniqueKey unique (pid)
2014-11-10 13:18:10 ERROR org.hibernate.tool.hbm2ddl.SchemaExport - ERROR: relation "_uniquekey" already exists
一意のキー名が正しく構築されていないように思えますが、おそらくバグでしょうか?