次の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を使用しています。
ありがとう