5

すべての変更を監視し、すぐに問題のオブジェクトを永続化することで、オブジェクト モデルをデータベースと同期させるアプリケーションを作成しようとしています。モデル内のオブジェクトの多くは、大きなリストまたはツリーに子を持っています。

データベースからオブジェクトをロードするときは、一方向のカスケード関係に依存して、そのすべての子も取得し、アプリケーションに含めます。

ただし、永続性を必要とする親オブジェクトのフィールドを変更することは可能であり、影響を受ける子はないと判断できます。したがって、カスケードされたすべての子が永続化された状態でデータベースにアクセスすることなく、親を永続化したいと考えています。

例えば

@Entity
public class Parent {

    @OneToMany(cascade=CascadeType.ALL)
    public List children;

}

親オブジェクトを永続化するときにカスケード オプションをオーバーライドするにはどうすればよいですか? それとも、単に REFRESH に設定して、カスケード永続化が不要であることを確認する必要がありますか?

4

1 に答える 1

4

データベースからオブジェクトを読み取り、それらを永続化することは、2つの異なるアノテーションに依存しています。

オブジェクトをロードするとFetchType.EAGER、関係のfetchプロパティで定義されているように、熱心な()関係のもう一方の端も取得されます。

JPAプロバイダーによっては、この動作をオーバーライドするオプションがある場合があります。EclipseLinkは、信じられないほど便利な方法QueryHint.BATCHで、確かにそうします。

永続化、削除、または更新する場合、カスケードタイプが関連します。

したがって、カスケードを失い、フェッチと問題を解決し続けます。

個人的にはカスケードはすべてトラブルを求めていると思いますが、意見はさまざまです。

まともなJPAプロバイダーには、すでにかなり洗練された(構成可能な)キャッシュスキームがあります。おそらく、なぜその特定のホイールを再発明しているのかを尋ねるべきですか?

純粋にパフォーマンスのための非同期更新の問題ですか?それとも他の理由がありますか?

于 2008-12-23T06:16:55.580 に答える