はどのように含めるかpromotions
の負荷を除外することができますか?次のマッピングオブジェクトにマッピングされたコレクションを条件付きでロードするにはどうすればよいですか?
<class name="com.domain.Season" table="cm.pub.jsn_mstr">
<id name="seasonCode" column="season_code" length="1"/>
<property name="name" type="string" column="name" length="20"/>
<set name="promotions" lazy="false">
<key column="season_code"/>
<one-to-many class="com.domain.Promotion" not-found="ignore"/>
</set>
</class>
を考えますか私はlazy="true"
を使用することができますが、私はジャクソンを使用してセッションを閉じた後の結果をシリアル化しています。
public Collection<Season> getSeasons(boolean withPromotions) {
final Session session = sessionFactory.getCurrentSession();
try {
session.beginTransaction();
return (List<Season>) session.createQuery("from Season s").list();
} finally {
session.getTransaction().commit();
}
}
UPDATE:遅延読み込みを使用して通報。
上記のgetSeasons
メソッドは、シーズンを取得してからJSON(Spring/MVCのビューリゾルバを使用)をシリアル化して実際にオブジェクトにアクセスしないMVCコントローラで使用されます。遅延でコレクションの結果をロードします(jacksonはすべてのコレクションプロパティでイテレータを呼び出します)。
public Collection<Season> getSeasons(boolean withPromotions) {
final Session session = sessionFactory.getCurrentSession();
final List<Season> r;
try {
session.beginTransaction();
r = (List<Season>) session.createQuery(
withPromotions
? "from Season s join fetch s.promotions"
: "from Season s"
).list();
} finally {
session.getTransaction().commit();
}
try {
for (Season s : r) {
for (Promotion p : s.getPromotions()) {
// Exception thrown here as we attempted to get an iterator.
LOG.debug("Promotion: " + p.getName());
}
}
} catch (Exception ex) {
LOG.error("Couldn't get promotions", ex);
}
return r;
}
そしてもちろんのマッピングはlazy="true"
それ以外の場合は、常にコレクションを熱心に読みます持っている必要があり、この時間を:ここで
は、例外がスローされますを示す例です。 promotions
フィールドの
<class name="com.domain.Season" table="cm.pub.jsn_mstr">
<id name="seasonCode" column="jsn_seas" length="1"/>
<set name="promotions" lazy="true">
<key column="jpr_seas"/>
<one-to-many class="com.domain.Promotion" not-found="ignore"/>
</set>
</class>
データ型がCollection<Promotion>
です。
これは、レイジーフラグをオンにすることを意味しますが、セッションが閉じられてからJacksonが例外をスローします。 –
セッションを閉じる前にこのメソッドを呼び出す必要があります。これは、休止状態で** Lazy **動作を動的に制御する方法です。私はあなたの方法でのその使用法で私の答えを更新しました。 – ManuPK
マヌーありがとう、私は問題を正しく説明していないと思う。ジャクソンがシリアル化しようとしたときに返されたシーズンが私のコントローラに戻ってくると、プロモーションプロパティが読み込まれ、セッションが閉じられると例外が発生します。 –