2017-03-15 15 views
0

私のアプリケーションでは、同じデータベース構造を持ち、実際のテーブルには書き込めない「ステージングデータ」のセットを格納する必要があります人間がステージングデータの内容を検討するまで。これらは実際のテーブルへの追加だけではなく、更新されます(つまり、同じエンティティインスタンスを参照する実テーブルと同じ主キーを持つステージングテーブルの値があります)。構造は同じでもテーブルは異なる2つのJPA/Springデータエンティティ

私のアプローチは、同一の構造(フィールド、列名など)を持ち、異なるテーブルに格納され、Spring CrudRepositoryパースペクティブとは完全に別々に扱われるオブジェクトを2つ持つことです両方のテーブルでクエリ結果を結合するためにクエリが発生します)。しかし、継承を使って互換性のある扱いができるようにして、アプリケーションがステージングデータの本当の処理をしているかどうかわからない/気にしないようにしています。そのため、多くの定型文を書く必要はありませんgetter/setter/converterコードです。

だから、私が今持っているものを基本的に3つのクラスです:@MappedSuperclassで注釈さと@Id注釈

  • BaseEntityを拡張し、いくつかの追加Identifierエンティティを介して共通IDプロパティを識別している

    1. BaseEntityその他のいくつかのプロパティのgetter/setterであり、注釈
    2. StagingIdentifierIdentifierを拡張しますが、別の@Table注釈値(及び他のフィールドまたはメソッドを追加していない)

    与えられる特定の条件、Iは本質的StagingIdentifierオブジェクトを保持しているテーブルの内容を取得し、それをマージする(すなわち既存のエントリの更新、新しいエントリの追加など)を識別子オブジェクトを保持するテーブルに追加します。私はEnversをデータベース監査のために使用していますので、監査能力を失うことになる低レベルのデータベースを実際には実行したくありません。

    CrudRepository<Identifier, Integer>を使用して、同じID値を持つデータベースにStagingIdentifierオブジェクトが保存されているときにIdentifierオブジェクトのリストを保存しようとすると、Hibernateがマージを実行しようとしたときに次の例外が発生します。

    org.springframework.orm.ObjectRetrievalFailureException:オブジェクト [ID = NULL] [com.domain.Identifier]指定サブクラスではありませんでした:指定されたオブジェクトの クラスは、永続コピーのクラスと一致しませんでした。

    ネストされた例外がorg.hibernate.WrongClassExceptionある:オブジェクト [ID = NULL]は指定されたサブクラス[com.domain.Identifier]ではありませんでした:指定されたオブジェクトの クラスが

    永続コピーのクラスと一致しませんでした

    私はHibernateが生成されるSQLを見てみると、私は次を参照してください。

    DEBUGのorg.hibernate.SQL - name3_10_0_として、level2_10_0_として、id1_10_0_としてidentifier0_.nameを identifier0_.levelをidentifier0_.id選択し、 identifier0_.parent_idをparent_i4_10_0_、identifier0_とします。clazz_ からclazz_0_(from id、level、name、parent_id、0をclazz_から選択します。 ユニオンすべての選択ID、レベル、名前、parent_id、1 clazz_ from staging_identifiers)identifier0_ここでidentifier0_.id =?

    ...上記のクエリでは、Identifierオブジェクトとオブジェクトの両方がフェッチされています。エラーが説明されています。

    私は可能なことをしようとしていますか?

  • +0

    申し訳ありませんでした –

    答えて

    0

    私は次のように私のクラスを再構築してやってしまった何を:私の質問から

    1. BaseEntity =不変
    2. AbstractIdentifier = @MappedSuperclass注釈すべてのプロパティ、ゲッターとBaseEntityを拡張し、新たな抽象クラス、セッターなどは
    3. に移動しました
    4. IdentifierStagingIdentifierは、AbstractIdentifierを拡張するかなりのスタブクラスですが、異なる@Tableの注釈値と、独自の春のデータリポジトリ
    私はその後、 IdentifierStagingIdentifierの間で変換するために、いくつかの方法が書かれている

    必要なときに(限り、私はしたくなかったので)とユニットテストがのことを確認しますこれらの方法の正確性

    関連する問題