我有以下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
在我看来,唯一的键名不能正确构建,可能是一个错误?
答案 0 :(得分:0)
索引在那里:
ON PUBLIC.ENTITYWITHNATURALID(NAME)
该异常明确指明了约束违规异常。
在PgAdmin中你应该在Schemas下看到它 - public - Tables - ENTITYWITHNATURALID - Constraints - _UNIQUEKEY_INDEX_6
如果您没有看到它尝试运行此SQL命令:
ALTER TABLE ENTITYWITHNATURALID ADD CONSTRAINT _UNIQUEKEY_INDEX_6 UNIQUE (name);
你应该得到:
ERROR: relation "_UNIQUEKEY_INDEX_6" already exists
SQL state: 42P07
如果约束已经存在。
答案 1 :(得分:0)
任何一个
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
@Column(length = ...)
有效!