30.7.3.2. on-load

on-load ストラテジーは、あるエンティティがロードされるときに、いくつかのエンティティの追加データをブロックでロードするもので、要求されたエンティティから開始し、選択された順序で次のいくつかのエンティティをロードします。このストラテジーは、find または select の結果が順方向にアクセスされるという理論に基づきます。クエリーが実行されると、JBoss は、見つかったエンティティの順番をリストキャッシュに格納します。後で、エンティティのいずれかがロードされるとき、JBoss はこのリストを使用して、ロードするエンティティのブロックを決定します。キャッシュに格納するリスト数は、エンティティの list-cachemax 要素で指定します。このストラテジーは、on-find ストラテジーでデータがロードされないという問題があるときにも使用されます。
on-find ストラテジーと同様に、on-loadread-ahead 要素で宣言します。この例の on-load 設定を次に示します。
<jbosscmp-jdbc>
  <enterprise-beans>
    <entity>
      <ejb-name>GangsterEJB</ejb-name>
      <!-- ... -->
      <query>
        <query-method>
          <method-name>findAll_onload</method-name>
          <method-params/>
        </query-method>
        <jboss-ql><![CDATA[
             SELECT OBJECT(g)
             FROM gangster g
             ORDER BY g.gangsterId
             ]]></jboss-ql>
        <read-ahead>
          <strategy>on-load</strategy>
          <page-size>4</page-size>
          <eager-load-group>basic</eager-load-group>
        </read-ahead>
      </query>
    </entity>
  </enterprise-beans>
</jbosscmp-jdbc>
このストラテジーによって、finder メソッドのクエリーは変更されません。
SELECT t0_g.id
       FROM gangster t0_g
       ORDER BY t0_g.id ASC
しかし、結果セットを反復するので、データのロード方法は異なります。ページサイズが 4 の場合、JBoss は、エンティティの namenickNamebadness フィールドをロードするのに、次の 2 つのクエリーを実行するだけでよくなります。
SELECT id, name, nick_name, badness
       FROM gangster
       WHERE (id=0) OR (id=1) OR (id=2) OR (id=3)
SELECT id, name, nick_name, badness
       FROM gangster
       WHERE (id=4) OR (id=5) OR (id=6) OR (id=7)
次の表は、これらのクエリーの実行を示したものです。

表30.3 on-load 最適化クエリー実行

id name nick_name badness hangout organization
0 Yojimbo Bodyguard 7 0 Yakuza
1 Takeshi Master 10 1 Yakuza
2 Yuriko Four finger 4 2 Yakuza
3 Chow Killer 9 3 Triads
4 Shogi Lightning 8 4 Triads
5 Valentino Pizza-Face 4 5 Mafia
6 Toni Toothless 2 6 Mafia
7 Corleone Godfather 6 7 Mafia