1

私は以下の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

一意のキー名が正しく構築されていないように思えますが、おそらくバグでしょうか?

4

2 に答える 2

0

インデックスはそこにあります:

 ON PUBLIC.ENTITYWITHNATURALID(NAME)

例外は、制約違反の例外を明確に指定します。

PgAdmin では、スキーマ - パブリック - テーブル - ENTITYWITHNATURALID - 制約 - _UNIQUEKEY_INDEX_6 の下に表示されます。

表示されない場合は、次の SQL コマンドを実行してみてください。

ALTER TABLE ENTITYWITHNATURALID ADD CONSTRAINT _UNIQUEKEY_INDEX_6 UNIQUE (name);

あなたは得るべきです:

ERROR: relation "_UNIQUEKEY_INDEX_6" already exists
SQL state: 42P07

制約がすでに存在する場合。

于 2014-11-10T10:21:50.110 に答える