1

hibernate-entitymanager在 Spring 应用程序中使用。我正在升级我的 Hibernate 版本。将其缩小到确切版本:当我从 4.2.1.Final 升级到 4.2.2.Final (或更高版本)时,当我的单元测试启动并尝试创建数据库时,我收到以下错误架构:

2014-03-02 18:02:51,559 ERROR [SchemaExport] [main] HHH000389: Unsuccessful: alter table Incident add constraint FK_d91dua6gkdp1jn826adqss3aq foreign key (uuid) references Incident
2014-03-02 18:02:51,559 ERROR [SchemaExport] [main] Constraint "FK_D91DUA6GKDP1JN826ADQSS3AQ" already exists; SQL statement:

    alter table Incident
        add constraint FK_d91dua6gkdp1jn826adqss3aq
        foreign key (uuid)
        references Incident [90045-170]

该错误不会阻止系统正常工作,但显然我无法在我的系统中出现如此严重的错误并且没有任何解释的情况下进行生产。

这看起来很像Incident表与自身有外键关系,但绝对不是这样。

我将尝试在此处复制实体的本质:Incident

@Entity
@Audited
@EntityListeners(value = {IncidentIdentifierPrePersistListener.class })
@FilterDefs( ... )
@Filters( ... )
public class Incident extends SomeBaseClass {

    @Id
    private String uuid = UUID.randomUUID().toString();

    @Column(nullable = false, unique = true)
    private long identifier;

    ... a bunch more fields ...
}

请让我知道我是否可以提供其他任何东西来帮助你们阐明这一点。我已经玩了几个小时,没有结果,非常感谢您的帮助。

4

1 回答 1

2

这是发生的事情:

  • Incident定义一个@ManyToOne实体Project
  • Project 错误地定义了 a@ManyToMany回实体Incident(应该是 a @OneToMany
  • 结果,Hibernate 产生了以下尴尬的约束:

    CONSTRAINT fk909a8f241708a1e FOREIGN KEY (uuid)
      REFERENCES incident (uuid) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
    
  • Incident继承SomeBaseClass@Inheritance(strategy = InheritanceType.JOINED)

  • 结果,Hibernate 生成了以下约束:

    CONSTRAINT fk909a8f2ddd08e84 FOREIGN KEY (uuid)
      REFERENCES somebaseclass (uuid) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
    
  • 由于 Hibernate 4.2.2 中的HHH-8217 (Make generated constraint names short and non-random),上述两个约束定义突然得到了相同的名称(Hibernate 只考虑了外键约束的实体,而不是外键的目标实体;注意如何generateName只接受一个Table作为参数)

  • 并且发生了相应的冲突:Constraint ... already exists

更改为@ManyToMany完全@OneToMany解决了这个问题。

顺便说一句,有问题的字段定义(带有 的那个@ManyToMany)以前也给我造成了 Hibernate Envers'的问题@Audited,我一直不明白的原因,现在也得到了解决。美好的一天。(不确定@Audited对于映射字段是否意义重大,但至少我可以@Audited在课堂上拥有而不需要处理该字段。)

于 2015-07-21T07:18:33.177 回答