0

Java Web アプリケーションのプロジェクトがあり、Glassfish の機能を PHP (nuSOAP) に出力する予定です。

mySQL 、すべてのテーブル、リレーションシップ、主キー、および外部キーで BD を作成しました。

その後、NetBeans、New Project -> Java Web APP を開きます。

私が行った手順は、
最初にHibernate Configuration Wizardを作成し、次にHibernate Reverse Engineering Wizardを作成し、次にデータベースからHibernateマッピングファイルとPOJOを作成し、最後にHibernateUtil(名前付き接続)を作成します

私のエンティティは: クラブ 1 対多 グレード 1 対多 チーム 1 対多 プレーヤー

これで、すべてのエンティティが Java プロジェクトに含まれるようになりました。そして、Club の DAO を作成しました。

public List<Club> listClubs(){
    try{
        session.beginTransaction();
        List<Club> listClub = (List<Club>)session.createQuery("from Club").list();
        session.getTransaction().commit();
        session.close();
        return listClub;
    }catch(Exception e){
        System.out.println("Erro ao listar os clubes"); 
        System.out.println(e.getMessage());
    }
    return null;
}

その後、すべてのクラブのリストを出力する WebService を作成したいと考えています。

@WebMethod(operationName = "listAllClubs")
public List<Club> listAllClubs() {
    ClubDAO pdo = new ClubDAO();
    List<Club> temp = pdo.listClubs();
    System.out.println("[WS:::]Tamanho do array devolvido: " + temp.size());
    return temp;
}

そして、glassfish ページで WebService をテストした後、次のエラーが発生します。

> Service invocation threw an exception with message : null; Refer to the server log for more details

サーバーログを取得すると、次のように表示されます。

> SEVERE: failed to lazily initialize a collection of role: pt.dai.entities.Club.grades, no session or session was closed

私はすでにインターネットでこのエラーについて検索しています。エンティティのxmlをdefault-lazy = 'false'に変更することはすでに解決していますが、これがすべてのクラブ情報をPHPに返すと、nuSOAPが大量のデータで壊れます..

lazzyLoad を使用してデータを WebService に送信するにはどうすればよいですか?

助けてくれてありがとう!

4

1 に答える 1

0

これは遅延読み込みの問題ではないようです。

遅延読み込みを使用すると、ネストされたエンティティをデータベースから読み取らないようにすることができますが、明示的に対処することはできません。

あなたの場合、遅延読み込みを使用しても、すべてのデータを送信しようとするため、このデータはすべて DB から読み取られます。

すべてを送信したくない場合は、クエリを制限する必要があります。それ以外の場合は、データをいくつかの部分に分割して、別々に送信できます。


編集:関係を削除するのが最も簡単ですが、満足のいく解決策ではありません。

問題の根本はシリアル化にあります。エンティティに双方向または循環関係があるようです。冗長な関係を削除するか、シリアライゼーションを禁止するすべてのクラス メンバーを一時的なものとしてマークすることで、この問題を解決する必要があります。

PS Hibernate セッションを閉じないと、解放されず、接続プールに戻りません。しばらくすると、接続プールが空になり、以降のクエリはすべて、空きセッションを待っている間にハングアップします。

于 2013-03-30T23:46:03.333 に答える