为什么@NaturalId不在数据库中创建唯一约束?

时间:2014-11-10 09:51:52

标签: java hibernate postgresql natural-key

我有以下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


编辑:之前的这篇文章是误导性的,因为我减少了事实以简化情况。通过这样做,我使这篇文章不一致!!

@Vlad是对的,但我意识到问题出在其他地方。

我错过了写的是有几个其他实体使用@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

在我看来,唯一的键名不能正确构建,可能是一个错误?

2 个答案:

答案 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)

任何一个

  1. 将InnoDB用于引擎,
  2. 或使用设置:
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
  1. 或与
  2. 结合
    @Column(length = ...)

有效!