1

専門の開発者が、メモリを節約するために永続化されたエンティティをLAZY ロードするようにアドバイスしている場所をよく見かけます。

概念は非常に明確です。使用しない大量の情報をロードしても意味がありません

しかし、私の日常の経験では、このベスト プラクティスを適用するのは簡単なことではありません。つまり、依存関係を定義する場合、たとえば aDEPARTMENTと an の間の 1 対多の関係を考えてみましょう。ビジネス ロジックでを処理するときに、従業員のリストが必要EMPLOYEEになる可能性が非常に高くなります。これはよくあることで、私はほとんどの場合 EAGER ロードを使用しています。Department

プログラムの観点から、私ができる最善のことは、そのようなフラグを付けて Dao メソッドを出荷することです

public Department getDepartment(String departmentName, boolean eagerly)

ここで、eagerlyに設定された属性trueが Department の完全な読み込みをトリガーします (これはデフォルトで LAZY 読み込みです。getEmployees()トランザクション内で呼び出して、従業員リストを読み込みます)。

問題をどのように処理しますか?LAZY ローディングは快適ですか?もしそうなら、私は何かが欠けていますか?

編集:

@Ayman の説明によると、休止状態を使用した次のアプローチについて説明したいと思います。

    public class Node {
        private Node parent;
        private Set<Node> children;

        public getParent(){
            if(parent==null)
                return Hibernate.initialize(parent);
            return parent;
        }

        public getChildren(){
            if(children==null)
                return Hibernate.initialize(children);
            return children;
        }
    }

それは受け入れられる実装ですか?欠点は何ですか?

4

1 に答える 1

1

状況によります。ライブラリの内部作業が公開されるため、eagerly フラグを追加することはお勧めしません。ユーザーに対して透過的である必要があります。

私が通常それを行う方法は、クラスです。部門には従業員のリストがあります。部門を読み取るときは、dept テーブルを読み取り、emp 配列を null のままにします。次に、従業員にアクセスする必要があるときに、リストが読み込まれたかどうかを確認します。実装がかなり簡単で、ライブラリのユーザーがライブラリの内部を知ることがないようにする必要があります。

于 2013-06-23T11:05:16.203 に答える