1

我正在关注 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 休眠 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

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

4

2 回答 2

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

如果约束已经存在。

于 2014-11-10T10:21:50.110 回答
0

任何一个

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

作品!

于 2019-07-22T07:54:33.197 回答