2011-07-20 13 views
0

私は、ユーザーが所属するロールを脇に許可するユーザー管理を行っています。単純なユーザー管理モデルでの休止状態の照会に関するヘルプが必要

ここでは一般的な考え方です:ユーザーロール、ロールライトと、クラスを使用して多対多(二重一対多)双方向がある多対多の双方向です。 User-UserSpecialRightとRight-UserSpecialRightの間には、多対一の側がUserSpecialRight側にあります。

私は、Hibernate3.6.1.FINAL + Spring3.0.5.RELEASE + Maven + shiro.usingの基準を使用しています。私は、特権を含むことに同意した役割に対して、ユーザーのすべての権利を引き出したいと考えています。 は、ここにマッピング

@Entity 
@Table(name = "user", uniqueConstraints = { 
@UniqueConstraint(columnNames = {"email"})}) 
@Component("user") 
public class User { 

//...... 
public User() { 
    //...... 
} 


@Id 
@GeneratedValue(generator = "uuid") 
@GenericGenerator(name = "uuid", strategy = "uuid.hex") 
@Column(name = "user_id", length = 36) 
private String id; 
@Column(name = "email", length = 150) 
private String email; 
@Column(name = "password", length = 150) 
private String password; 
// ... 

@ManyToMany(fetch=FetchType.LAZY, mappedBy="users") 
private Set<Role> roles = new HashSet<Role>(); 

@OneToMany(targetEntity=UserRightAssoc.class,fetch=FetchType.LAZY,mappedBy="user") 
private Set<UserRightAssoc> specialrights = new HashSet<UserRightAssoc>(); 

//..... 
} 


@Entity 
@Table(name = "role") 
@Component("role") 
public class Role { 

//.... 
public Role() { 
    //.... 
} 
@Id 
@GeneratedValue(generator = "system-uuid") 
@GenericGenerator(name = "system-uuid", strategy = "uuid") 
@Column(name = "role_id", length = 36) 
private String id; 

@Column(name = "role_name") 
private String roleName; 

//.... 

@ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
@JoinTable(name = "role_user_map", joinColumns = { 
@JoinColumn(name = "role_id")}, 
inverseJoinColumns = { 
@JoinColumn(name = "user_id")}) 
private Set<User> users = new HashSet<User>(); 

@ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
@JoinTable(name = "role_right_map", joinColumns = { 
@JoinColumn(name = "role_id")}, 
inverseJoinColumns = { 
@JoinColumn(name = "right_id")}) 
private Set<Right> rights = new HashSet<Right>(); 
//..... 
} 


@Entity 
@Table(name = "rights") 
@Component("right") 
public class Right { 

@Id 
@GeneratedValue(generator = "system-uuid") 
@GenericGenerator(name = "system-uuid", strategy = "uuid") 
@Column(name="right_id") 
private String id; 
@Column(name = "right_name",unique=true) 
private String rightName; 
@Column(name = "description") 
private String description; 

@ManyToMany(fetch = FetchType.LAZY, mappedBy = "rights") 
private Set<Role> roles = new HashSet<Role>(); 

@OneToMany(targetEntity=UserRightAssoc.class,fetch=FetchType.LAZY,mappedBy="right") 
private Set<UserRightAssoc> specialrights = new HashSet<UserRightAssoc>(); 
//...... 
} 


@Entity 
@Table(name = "user_right_assoc") 
@Component("userrightassoc") 
public class UserRightAssoc { 

//.... 

@Embeddable 
public static class Id implements Serializable { 

    @Column(name="user_id") 
    private String userId; 

    @Column(name="rightId") 
    private String rightId; 

    public Id(){} 

    public Id(String userId, String rightId) { 
     this.userId = userId; 
     this.rightId = rightId; 
    } 

    // equal and hashcode 
} 

@EmbeddedId 
private Id id = new Id(); 

@Temporal(TemporalType.TIMESTAMP) 
private Date dateCreate = new Date(); 

@ManyToOne(fetch=FetchType.LAZY,targetEntity=User.class) 
@JoinColumn(name="user_id", insertable=false, updatable=false) 
private User user; 

@ManyToOne 
@JoinColumn(name="right_id", insertable=false, updatable=false) 
private Right right; 

}私はそれがあまりにも長くはありません願っていマッピングについてです

okです。 RighDAOImplには、私が望む結果を私に与えることができない以下の方法があります。

public Set<Right> getRightsByRoleAndEmail(String roleName, String email) { 
    try { 
     List list = this.getSessionFactory().getCurrentSession().createCriteria(this.getPersistentClass()) 
       .createAlias("roles", "r") 
//    .createAlias("specialrights", "sp") 
//    .createAlias("sp.user", "u") 
       .add(Restrictions.eq("r.roleName", roleName)) 
//    .add(Restrictions.eq("u.email", email)) 
       .list(); 

     Set<Right> rigths = new HashSet<Right>(list); 
     return rigths; 
    } catch (Exception e) { 
     logger.info("Error fecthing righs for a role and user", e); 
     return null; 
    } 

} 

ので、コメントの部分との方法は、私のテストクラスでは成功したが、その後、特殊な右の部分は、それが故に、テストが失敗し、nullを返し完全ignored.butコメントが削除された後です。

現時点では、私のフィクスチャ(import.sql)のデフォルトユーザーのための特別なことはありませんが、特別な権利がない場合でもクエリは引き続き権利を返すはずです。ここ

私はコメントすることなく、基準の方法を回すクエリは次のとおりです。

select 
    this_.right_id as right1_0_4_, 
    this_.date_created as date2_0_4_, 
    this_.description as descript3_0_4_, 
    this_.last_modified as last4_0_4_, 
    this_.right_name as right5_0_4_, 
    roles5_.right_id as right2_0_, 
    r1_.role_id as role1_, 
    r1_.role_id as role1_1_0_, 
    r1_.date_created as date2_1_0_, 
    r1_.description as descript3_1_0_, 
    r1_.last_modefied as last4_1_0_, 
    r1_.role_name as role5_1_0_, 
    sp2_.rightId as rightId3_1_, 
    sp2_.user_id as user2_3_1_, 
    sp2_.dateCreate as dateCreate3_1_, 
    sp2_.right_id as right4_3_1_, 
    right8_.right_id as right1_0_2_, 
    right8_.date_created as date2_0_2_, 
    right8_.description as descript3_0_2_, 
    right8_.last_modified as last4_0_2_, 
    right8_.right_name as right5_0_2_, 
    u3_.user_id as user1_2_3_, 
    u3_.dateCreated as dateCrea2_2_3_, 
    u3_.email as email2_3_, 
    u3_.full_name as full4_2_3_, 
    u3_.lastLogin as lastLogin2_3_, 
    u3_.lastModified as lastModi6_2_3_, 
    u3_.password as password2_3_ 
from 
    rights this_ 
inner join 
    role_right_map roles5_ 
     on this_.right_id=roles5_.right_id 
inner join 
    role r1_ 
     on roles5_.role_id=r1_.role_id 
inner join 
    user_right_assoc sp2_ 
     on this_.right_id=sp2_.right_id 
left outer join 
    rights right8_ 
     on sp2_.right_id=right8_.right_id 
inner join 
    user u3_ 
     on sp2_.user_id=u3_.user_id 
where 
    r1_.role_name=? 
    and u3_.email=? 

ので、私は見ていないうち残しているものは、そこにある考えていませんか?その方法を除いては何も問題ありません。あなたは、彼らが特別な権利を持っていない場合でも、ユーザーを返すようにしたい場合は何も存在しない場合、あなたは何を得ることはありませんように、あなたは、それを照会することはできません

答えて

1

を読み取るための

感謝バック。 Restrictions.eqを追加すると、このような状況が発生します。

代わりに、Userオブジェクトが返されると、クエリからSpecial Rightsセクションを削除し、関連付けを初期化します。特別な権利がない場合でも、あなたは左を必要とするレコードを取得する

List<User> list = this.getSessionFactory().getCurrentSession().createCriteria(User.class) 
      .createAlias("roles", "r") 
      .add(Restrictions.eq("r.roleName", roleName)) 
      .list(); 
for (User u : list) { 
    if(u.getSpecialRights() != null) { 
     u.getSpecialRights().size(); // loads the special rights if they are not null 
    } 
} 
+0

おかげで男に参加し、sense.Currently私はそれはトランザクションのサービスメソッドで個別にすべてこれを実行します。だから、私は引っ張って、役割のための権利をし、ユーザーのためにspecialrightを引き出します。 –

0

List list = this.getSessionFactory().getCurrentSession().createCriteria(this.getPersistentClass()) 
    .createAlias("roles", "r") 
    .createAlias("specialrights", "sp", JoinType.LeftOuterJoin) 
    .createAlias("sp.user", "u", JoinType.LeftOuterJoin) 
    .add(Restrictions.eq("r.roleName", roleName)) 
    .add(Restrictions.eq("u.email", email)) 
    .list(); 
関連する問題