0

現在のユーザーをセッションに保存し、現在のユーザー(example:user.getRole.getRoleName())を使用すると、LIEを取得しました。どうすればこの問題を解決できますか、私のコードは次のようになります

コントローラ:

public String home(){
    Users users = userService.getCurrentUser();
    if(users.getRole().getRoleName().equals("admin")){ //causing LIE
    ....
}

UserService:

@Override
public Users getCurrentUser(){
    session =  ActionContext.getContext().getSession();
    return (Users) session.get("user");
}

しかし、userService.getCurrentUser()をこのように変更すると、エラーは解決されますが、現在のユーザーを使用するたびにデータベースに接続する必要があるため、これは正しい方法ではないと思います。

@Override
public Users getCurrentUser(){
    session =  ActionContext.getContext().getSession();
    return daoManager.getDetailUser(((Users) session.get("user")).getUsername());
}

DaoManager.getDetailUserはこのようなものです

@Override
public Users getDetailUser(String username) {
    try {
        Users user = (Users)sessionFactory.getCurrentSession().createQuery("SELECT U FROM Users U WHERE U.username=:USERNAME")
             .setParameter("USERNAME", username)
             .uniqueResult();
        return user;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

この問題を解決する他のより良い方法はありますか?ありがとうございました。

4

2 に答える 2

1

最も可能性の高い説明は、サービス レイヤーを終了するときに Spring が現在のセッションを閉じるということですUserService(冬眠?

fetch=FetchType.EAGERこれを回避するには、 で指定して hibernate が遅延読み込みを行わないようにするか、 OpenSessionInViewroleパターンを使用することができます (ただし、これはアンチパターンと見なされる場合があります。ビューでの Hibernate Open Session が悪い慣行と見なされるのはなぜですか? を参照してください)。

于 2012-04-10T08:50:39.807 に答える
1

これを解決する最も簡単な方法は、セッションが閉じられる前に遅延フェッチされたフィールドにアクセスすることです。

@Override
public Users getCurrentUser(){
    session =  ActionContext.getContext().getSession();
    Users user = (Users) session.get("user");
    user.getRole(); //Accessed to resolve lazy field
    return user;
}

FetchType.EAGER はお勧めしません。アクセスを制御できないため、必要かどうかに関係なく常にフェッチされます.データモデルにいくつかのEAGERフィールドを追加すると、最も単純なリクエストのためにデータベース全体を突然フェッチします..

クエリにも使用できますJOIN FETCH

于 2012-04-10T09:51:13.743 に答える