12

次の構造のメソッドがあります。

public void run(){
    ... 
    for (...) { //this part works correct

        User.withTransaction {
            User user = User.findByUsername(...);

            Position pos = Position.findByName(...)
            if(pos){ ...
            } else { ...
                try{
                    pos.save(flush:true);
                    user.position = pos;
                } catch (Exception e){ ... }
            }
            ...
            try{
                user.save(flush:true, failOnError: true);
            } catch (Exception e){ ... }
        }
    }
    //this part doesn't work
    User.findAll().each {
    ...
        if (...){
            User.withTransaction{
                ...
                //here the operation fails with 
                //org.hibernate.LazyInitializationException: 
                //could not initialize proxy - no Session
                if (!userDetailsMap.containsKey(it.username) 
                         && it.userStatus != blocked){
                    it.userStatus = blocked
                    it.save(flush:true) 
                }
            }
        }
    }
}

ここで発生する例外org.hibernate.LazyInitializationException: could not initialize proxy - no Sessionは、コードの 2 番目の部分にあります。ここで、userStatusフィールドは別のドメイン クラスへの参照です。

プロパティがチェックされる前にコードにit.refresh()andを追加しようとしましたが、役に立ちません。Hibernate.initialize(it)ここで何が間違っていますか?

upd: プロパティがチェックされる前にメソッドを呼び出そうとしましたit.attachが、メソッド呼び出しの直後に の値it.attachedfalse.

4

3 に答える 3

0

サブドメインクラスを1つのクラスに使用していたときに、まったく同じエラーが発生しました。データサイズがページサイズを超えている場合、「メッセージ: プロキシを初期化できませんでした - セッションがありません」というエラーが表示されます。

<> lazy:false を使用すると、hibernate はセッション アタッチメントを適切に使用し、適切なデータを表示します。

この投稿をありがとう。エラーを解決できました。

于 2014-09-20T15:20:55.463 に答える