学习SPRING SECURITY时用到HIBERNATE多对多,现简单记录
例:现有用户、角色、权限、资源四表:
其中用户与角色多对多、角色与权限多对多、权限与资源多对多,那么实际数据库中需要用到7张表
实体类如下:
用户:Users
public Users implements Serializable{
private Integer user_id;
private String user_name;
。。。。。。
private Set<Roles> roles=new HashSet<Roles>();
// set/get
。。。。。。
}
角色:Roles
public Roles implements Serializable{
private Integer role_id;
private String role_name;
private Set<Users> users=new HashSet<Users>();
。。。。。。
// set/get
。。。。。。
}
权限:Authorities
资源:Resources
映射文件:
用户角色多对多
Users.hbm.xml:
<set name="roles" table="users_roles" >
<key column="user_id"/>
<many-to-many class="Roles" column="role_id"/>
</set>
Roles.hbm.xml:
<set name="users" table="users_roles" inverse="true">
<key column="role_id"/>
<many-to-many class="Users" column="user_id"/>
</set>
具体不写了反正都是这种格式,其中inverse必须指明,意思是由哪一方维护关系表,像上面Roles.hbm.xml中设置了inverse="true"时就说明由Users来维护
多表之间多对多查询:
例:根据用户ID获取用户所有资源
hql="SELECT us from Users us join us.roles ro join ro.authorities au join au.resources re where us.user_id=?";