Почему @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 ответ
Или
- использовать InnoDB для движка,
- или используйте настройку:
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
- или в сочетании с
@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
в случае, если ограничение уже существует.