0

次のHibernateエンティティがあります:ユーザー、ロール、チーム。UserTeamRoleエンティティもあります。これは、基本的に、ユーザー、ユーザーの役割、およびユーザーが所属するチームの間の接続です。

@Entity
@Table(name = "user_team_role")
public class UserTeamRole {

    private Long id;
    private User user;
    private Role role;
    private Team team;
    [...]  
}

私のJSFマネージドBeanでは、フォームで取得した特定のユーザー指定名のユーザーとすべてのUserTeamRolesを取得する必要があります。私はUserDAOでそれを行います:

public User getUserByDn(String dn) {
        User result = (User) getSessionFactory().getCurrentSession()
                .createCriteria(User.class)
                .setFetchMode("userTeamRoles", FetchMode.JOIN)
                .add(Restrictions.like("dn", dn)).uniqueResult();
        return result;
    }

コレクションにアクセスする必要がある時点でセッションが閉じられたため、BeanでLazyInitializationExceptionが発生するため、FetchModeを使用しました。

ただし、この後、このUser.userTeamRolesコレクションをループして、各ロールの名前を取得する必要もあります。

私がこれをするとき:

    if (null != u.getUserTeamRoles()) {
        for (UserTeamRole urt : u.getUserTeamRoles()) {
            // here get role for every UserTeamRole

            grAuth.add(new SimpleGrantedAuthority(urt.getRole().getName()));
        }
   }

例外が発生します:

原因:org.hibernate.LazyInitializationException:プロキシを初期化できませんでした-ロールエンティティのセッションがありません。

したがって、私の質問は、ここで行ったように、各UserTeamRoleのロールを取得する方法です。.setFetchMode( "userTeamRoles"、FetchMode.JOIN)getUserByDn

FetchModeの呼び出しを「チェーン」しようとしましたが、機能しません。アソシエーションのメンバーに対してクエリをチェーンできることを確認しましたが、クエリを実行する必要はありません。ロールを初期化するだけで、さらに使用できるようになります。

私はHibernate4、Spring 3、JSF2を使用しています。

ありがとう

4

2 に答える 2

3

エイリアスを作成する必要があります。

Criteria c = getSessionFactory().getCurrentSession().createCriteria(User.class, "user");
c.setFetchMode("user.userTeamRoles", FetchMode.JOIN);
c.createAlias("user.userTeamRoles", "utr", CriteriaSpecification.LEFT_JOIN);
c.setFetchMode("utr.role", FetchMode.JOIN);
c.add(Restrictions.like("dn", dn));

対応するHQLクエリは非常に似ていますが、IMOを読んで理解するのがはるかに簡単です。

select distinct user from User user
left join fetch user.userTeamRoles utr
left join fetch utr.role
where user.dn like :dn
于 2012-12-07T10:27:19.357 に答える
0

誰かが関連する怠惰なコレクションをフェッチするCriteriaAPIに関連するヘルプを得ることができるように、今すぐ回答を投稿してください。hibernate-4.3.11.Finalを使用しています

次の基準クエリが機能します。

Criteria c = getSessionFactory().getCurrentSession().createCriteria(User.class, "user");
c.setFetchMode("user.userTeamRoles", FetchMode.JOIN);
c.createAlias("user.userTeamRoles", "utr", JoinType.LEFT_OUTER_JOIN);
c.setFetchMode("utr.role", FetchMode.JOIN);
c.createAlias("utr.role", "role", JoinType.LEFT_OUTER_JOIN);
c.add(Restrictions.like("dn", dn));
c.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); // optional.
于 2016-02-04T07:44:40.060 に答える