私のアプリケーションでは、同じデータベース構造を持ち、実際のテーブルには書き込めない「ステージングデータ」のセットを格納する必要があります人間がステージングデータの内容を検討するまで。これらは実際のテーブルへの追加だけではなく、更新されます(つまり、同じエンティティインスタンスを参照する実テーブルと同じ主キーを持つステージングテーブルの値があります)。構造は同じでもテーブルは異なる2つのJPA/Springデータエンティティ
私のアプローチは、同一の構造(フィールド、列名など)を持ち、異なるテーブルに格納され、Spring CrudRepository
パースペクティブとは完全に別々に扱われるオブジェクトを2つ持つことです両方のテーブルでクエリ結果を結合するためにクエリが発生します)。しかし、継承を使って互換性のある扱いができるようにして、アプリケーションがステージングデータの本当の処理をしているかどうかわからない/気にしないようにしています。そのため、多くの定型文を書く必要はありませんgetter/setter/converterコードです。
だから、私が今持っているものを基本的に3つのクラスです:@MappedSuperclass
で注釈さと@Id
注釈
BaseEntity
を拡張し、いくつかの追加Identifier
エンティティを介して共通IDプロパティを識別している
BaseEntity
その他のいくつかのプロパティのgetter/setterであり、注釈StagingIdentifier
Identifier
を拡張しますが、別の@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
オブジェクトとオブジェクトの両方がフェッチされています。エラーが説明されています。
私は可能なことをしようとしていますか?
申し訳ありませんでした –