1. ホーム
  2. java

[解決済み] Hibernateのレイジーロードアプリケーション設計

2023-05-13 16:42:39

質問

私がよく使うのは ハイバーネート と組み合わせて Spring フレームワークとその宣言的なトランザクションの区分け機能 (例えば @Transactional ).

周知のように、ハイバーネートは 非侵襲的 であり 透明で を可能な限り実現する必要がありますが、これは はもう少し難しい を採用した場合 lazy-loaded のような関係になります。


透明度の異なるいくつかのデザイン案がありますね。

  1. リレーションシップを遅延ロードされないようにする(例. fetchType=FetchType.EAGER)
    • これは、レイジーローディングの考え全体を裏切るものです。
  2. コレクションを初期化するには Hibernate.initialize(proxyObj);
    • これは、DAOとの結合が比較的高いことを意味します。
    • でインターフェースを定義することができますが initialize で定義できますが、他の実装が同等のものを提供することは保証されません。
  3. トランザクションの振る舞いを永続的な Model オブジェクト自体にトランザクションの挙動を追加します。 ダイナミックプロキシ または @Transactional )
    • 私は動的プロキシのアプローチを試したことはありませんが、永続オブジェクト自体で @Transactional を動作させたことはないようです。おそらく、hibernate がプロキシで動作していることが原因だと思います。
    • トランザクションが実際に行われているときに制御が失われる
  4. 遅延/非遅延APIの両方を提供する、例えば loadData()loadDataWithDeps()
    • アプリケーションに、いつどのルーチンを使用するかを知らせることで、再び緊密な結合を実現します。
    • メソッドのオーバーフロー。 loadDataWithA() , ...., loadDataWithX()
  5. 依存関係のルックアップを強制する。 byId() 操作
    • オブジェクト指向でないルーチンを多く必要とする、例. findZzzById(zid) とか、それから getYyyIds(zid) の代わりに z.getY()
    • トランザクション間に大きな処理オーバーヘッドがある場合、コレクション内の各オブジェクトを1つずつフェッチするのが便利なことがあります。
  6. の一部を アプリケーション のみの代わりに @Transactional を使用します。 DAO
    • ネストされたトランザクションの可能な考慮事項
    • トランザクション管理に適合したルーチンを必要とする(例えば、十分に小さい)。
    • 大きなトランザクションを引き起こすかもしれませんが、プログラムへの影響は小さいです。
  7. DAOに動的な プロファイルを取得する , 例, loadData(id, fetchProfile);
    • アプリケーションは、以下の場合にどのプロファイルを使用するかを知っている必要があります。
  8. AoP型のトランザクション、例えば操作を傍受し、必要な時にトランザクションを実行する。
    • バイトコード操作またはプロキシ利用が必要
    • トランザクションの実行時に制御不能になる
    • いつものように黒魔術 :)
  9. 何かオプションを見逃しましたか?


    の影響を最小限に抑えようとする場合、どのようなアプローチが望ましいですか? lazy-loaded の関係の影響を最小化しようとする場合、どちらのアプローチが好ましいですか?

    (あ、それと申し訳ないのですが WoT )

    どのように解決するのですか?

    <ブロッククオート

    周知のように、hibernate は可能な限り非侵襲的で透過的であろうとします。

    最初の仮定は間違っていると言えるでしょう。なぜなら、アプリケーションは常にエンティティのライフサイクルと読み込まれるオブジェクトグラフのサイズに気を配らなければならないからです。

    Hibernateは思考を読み取ることができないので、特定の操作のために特定の依存関係のセットが必要であることが分かっている場合、何らかの方法でHibernateに意図を伝える必要があることに注意してください。

    この観点から、これらの意図を明示的に表現するソリューション(すなわち、2、4、7)は合理的に見え、透明性の欠如に悩まされることはありません。