JPA 用户与角色 一对多 or 多对多?

matrix1984 2010-03-14 05:31:35
一个用户可以拥有多个角色,当然一个角色也可以被多个用户所拥有。看起来应该是多对多关系?!
实际的情况是,我只想知道用户A拥有多少角色,并不关心角色B被哪些人拥有。
因此,我想做映射时,应该是一对多,并附带有中间表。那应该怎么做映射呢?
就是附带中间表的一对多单向关联?!!~

表User:userid, username
表Role:roleid, rolename
中间表user_role:id, userid, roleid
...全文
435 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
matrix1984 2010-03-16
  • 打赏
  • 举报
回复
现在是用一对多单向关联,代码如下:

//User.java:

@Entity
public class User {
private Integer userid;
private String username;
private String password;

private Set<Role> roles = new HashSet<Role>();

@Column
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}

@Id
@GeneratedValue
public Integer getUserid() {
return userid;
}
public void setUserid(Integer userid) {
this.userid = userid;
}
@Column(length=10, nullable=false)
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}

@OneToMany(cascade = CascadeType.REFRESH, fetch=FetchType.EAGER)
@JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "userid"),
inverseJoinColumns = @JoinColumn(name = "roleid"))
public Set<Role> getRoles() {
return roles;
}

public void setRoles(Set<Role> roles) {
this.roles = roles;
}

// 增加角色
public void addRole(Role role) {
this.roles.add(role);
}
}


//Role.java:

@Entity
public class Role {
private Integer roleid;
private String rolename;
private String description;

@Column
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Id
@GeneratedValue
public Integer getRoleid() {
return roleid;
}
public void setRoleid(Integer roleid) {
this.roleid = roleid;
}
@Column
public String getRolename() {
return rolename;
}
public void setRolename(String rolename) {
this.rolename = rolename;
}
}


好像可以满足我的要求了。同时,我做单元测试时,删除用户时,也会删除中间表的记录,这一切似乎都跟Role没关系,Role本来就应该是单独存在的。就像一个人一辈子去过很多省份,这Person与Province是一对多的单向关联,这个人去火星之后,只要删除这个人,以及person_province的相关记录即可,无须对Province做操作,Province还是33个。是这样的吗?!
matrix1984 2010-03-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 volsummoning 的回复:]
spring多对多映射
[/Quote]
我觉得必须是manytomany,因为如果按我上面的onetomany,many一方在中间表是唯一的,如果这样,我就无法让不同用户拥有相同的角色了。thanks。
volsummoning 2010-03-14
  • 打赏
  • 举报
回复
spring多对多映射
matrix1984 2010-03-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xyz20003 的回复:]
http://www.family168.com/oa/springsecurity/html/ch003-custom-db.html
[/Quote]
thanks.
我现在的意思也差不多,在User里如下配置:

@OneToMany(cascade = CascadeType.REFRESH, fetch=FetchType.EAGER)
@JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "userid"),
inverseJoinColumns = @JoinColumn(name = "roleid"))
public List<Role> getRoles() {
return roles;
}

public void setRoles(List<Role> roles) {
this.roles = roles;
}
临远 2010-03-14
  • 打赏
  • 举报
回复
或者直接看我们这个
临远 2010-03-14
  • 打赏
  • 举报
回复
参考springside里的权限设计。

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧