2010-11-19 12 views
0

私は私の図b内のノートは、Aの多くの子供に一つであり、私のデータベースにマッピングされた以下のクラス構造を持っている、など私は私の結果が戻って休止状態からの設定取得するとき休止状態と選択的遅延ロード

a 
-b 
--c 
-d 
--e 
---f 
---g 

今、私はそれをプラグインjibxにマーシャリングされ、クライアントに送信されます。私の問題は、jibxが遅延ロードレコードにアクセスしようとしたときです。その時点で、休止状態のセッションから切断されたため、例外が発生します。

今、さらに悪化させるために、クラスa、b、c、dのすべてのレコードを持ちたいがe、f、gのレコードはない。次の問合せでは、a、d、e、f、gおよびすべてのbまたはcと、次の問合せのすべてがa、d、gおよびすべての残りのものを必要とする場合があります。

ので、私のDAOクラスは次のようになります

public class SurveyNameDAO extends HibernateDaoSupport 
{ 
public List<SurveyName> getPermittedSurveys(String userName) 
    { 
     StringBuffer sql = new StringBuffer(); 
     sql.append("select distinct sn "); 
     sql.append("from SurveyName as sn, SurveyNameStore name_store "); 
     sql.append("where name_store.showStoreLocation.storeName in (select ng.pnName "); 
     sql.append("from NukeGroups as ng, NukeUsers as nu "); 
     sql.append("where nu.pnName = '" + userName + "')"); 

     SurveyName loc = null; 
     List l = getHibernateTemplate().find(sql.toString()); 

     return l; 

    } 
} 

基本的な質問は、私はリターンクラスをロードするように言って指標のいくつかの種類を追加することができますどこか私はこの方法を変更(およびそれのような多くの)可能です私は上記のことを話し、その後、休止状態から完全に切り離し、jibxに送るときの遅延ロードを忘れてしまいます。

+0

クエリの変数をa、b、c、...に置き換えることをお勧めします。上記の図のように、関係がどのようにクエリに関連しているかを理解することができます。それ以外は、これは私が定期的にやるより少し多めのSQLなので、実用的なものより少しでも努力しなければ助けてくれるのか分かりません=) – stevendesu

+0

それはHQLクエリの問題ではありません。結果をそのクラスにロードする方法を休止状態に伝えます。 – scphantm

答えて

0

デフォルトでは、hibernateは子オブジェクトを遅延ロードします。つまり、照会されたオブジェクトのみがロードされます。つまり、例ではSurveyNameオブジェクトがロードされます。 SurveyName仮定

を使用すると、上記に示してきた木、BDの唯一のIDの中でエンティティに対応で直接参照オブジェクトでありますが読み込まれます。

詳しくはWhat is lazy loading in Hibernate?Explanations of lazy loadingです。

ご質問のとおり、セッション内で参照されているオブジェクトを取得する必要があります。だからあなたの例では、リストlを反復し、それらがロードされるように、リスト内の各アイテムにSurveyNameStoreオブジェクトをフェッチする必要があります。

この後、あなたはSurveyNameオブジェクトを渡すことができますし、SurveyNameStore参照がクライアントに送信するために利用されます。

同様に、必要なすべてのオブジェクトを各メソッドで個別に読み込みます。

私はあなたのクラス構造を持っていないので、私はあなたに正確な解決策を与えることはできませんが、あなたがすでに解決していない場合は、

+0

は今問題ではありません。私はクライアントに、休止状態を街頭に投げ捨てて、まっすぐなJDBCでアプリケーションを書き直すようにしました。既に私たちが書き直したモジュールでは、以前に遭遇していたものの数分の1にバグの数が減少しています。私は再び休止状態を使用することはありません、jdbcははるかに簡単です。 – scphantm

+0

私の経験では、休止状態は基本的なものを非常に簡単にしましたが、カスタム/複雑な要件や境界の場合はかなり問題になります。よかった! –