Почему @NaturalId не создает уникальное ограничение в базе данных?

Я следую за Entity-Snipped

@Entity
public class EntityWithNaturalId extends BaseEntity {
    @NaturalId public String name;

    private EntityWithNaturalId() {}

    public EntityWithNaturalId(String name) {  this.name = name;  }
}

Если я пытаюсь сохранить сущность с одним и тем же именем дважды, я получаю следующую ошибку (как и ожидалось):

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 Hibernate 4.2.0


РЕДАКТИРОВАТЬ: этот пост раньше вводил в заблуждение из-за того, что я сократил факты, чтобы упростить ситуацию. Сделав это, я сделал этот пост непоследовательным!!

@ Влад был прав, но я понял, что проблема в другом.

Что я пропустил, так это то, что есть несколько других сущностей, которые используют @NaturalId. Hibernate пытается создать все ограничения с именем _UNIQUEKEY. (Префикс отсутствует)

Только первый действительно создан. Все остальные выдают это исключение:

 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

Мне кажется, что уникальные имена ключей не собраны правильно, возможно, это ошибка?

1 ответ

Или

  1. использовать InnoDB для движка,
  2. или используйте настройку:
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
  1. или в сочетании с
    @Column(length = ...)

работает!

Индекс есть:

 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

в случае, если ограничение уже существует.

Другие вопросы по тегам