1

hibernate-entitymanagerSpringアプリケーションで使用しています。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エンティティにa を定義Project
  • Project @ManyToManyエンティティに戻る a を誤って定義しましたIncident( である必要があります@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 (生成された制約名を短くランダムでないものにする)の結果、上記の 2 つの制約定義が突然同じ名前になりました(Hibernate は外部キー制約のエンティティgenerateNameのみを考慮し、考慮しませんでした)。外部キーのターゲット エンティティ。パラメータとして1 つだけを取る方法に注意Tableしてください)

  • そして、対応する衝突がありました:Constraint ... already exists

を に変更すると、これが完全@ManyToManyに修正されます。@OneToMany

ちなみに、問題のあるフィールド定義 ( が付いているもの@ManyToMany) は、以前に Hibernate Envers の問題を引き起こしましたが@Audited、その理由は私には理解できませんでしたが、それも解決されました。いい日です。(@Auditedマップされたフィールドに大きな意味があるかどうかはわかりませんが、少なくとも@Audited、このフィールドを処理する必要なくクラスを使用できます。)

于 2015-07-21T07:18:33.177 に答える