这次写了一个基于Hibernate Annotation的权限管理模块。
顺便复习一下Hibernate的Annotation。
由于刚开始接触权限管理。 本文的例子比较简单。
先来看权限管理的数据库设计。
User表。 Role表。 Menu表。 分别代表是用户表,角色表,菜单(权限)表。
其中菜单表是一棵树。 自关联。
可以为用户,角色分配权限。
所以User与Role之间是多对多关系, Role与Menu之间是多对多关系, User与Menu之间也是多对多关系。
为什么Role和Menu之间是多对多关联了,可以为Role分配权限。然而为什么User和Menu之间还要形成多对多关联呢?
----因为这样配置比较灵活 - -.. 好吧。
我们用Hibernate的Annotation配置。 简单,方便。
先看Menu表。 这是一个自关联的表, 也就是一棵树。
@Entity
public class Menu {
private Integer menu_id;
private String menu_name;
private Menu parent;
private List<Menu> children;
@Id
@GeneratedValue
public Integer getMenu_id() {
return menu_id;
}
public void setMenu_id(Integer menu_id) {
this.menu_id = menu_id;
}
public String getMenu_name() {
return menu_name;
}
public void setMenu_name(String menu_name) {
this.menu_name = menu_name;
}
@ManyToOne
@JoinColumn(name="menu_pid")
public Menu getParent() {
return parent;
}
public void setParent(Menu parent) {
this.parent = parent;
}
@OneToMany(mappedBy="parent")
public List<Menu> getChildren() {
return children;
}
public void setChildren(List<Menu> children) {
this.children = children;
}
}
然后是User表
@Entity
public class User {
private Integer user_id;
private String user_name;
private String user_password;
private Set<Role> roles;
private List<Menu> menus;
public User() {
super();
}
public User(Integer user_id, String user_name, String user_password) {
super();
this.user_id = user_id;
this.user_name = user_name;
this.user_password = user_password;
}
public User(String user_name, String user_password) {
super();
this.user_name = user_name;
this.user_password = user_password;
}
@ManyToMany(targetEntity=Role.class)
@JoinTable(name="user_role_link",
joinColumns={@JoinColumn(name="user_id")},
inverseJoinColumns={@JoinColumn(name="role_id")})
public Set<Role> getRoles() {
return roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
@ManyToMany(targetEntity=Menu.class)
@JoinTable(name="user_menu_link",joinColumns={@JoinColumn(name="user_id")}, inverseJoinColumns={@JoinColumn(name="menu_id")})
public List<Menu> getMenus() {
return menus;
}
public void setMenus(List<Menu> menus) {
this.menus = menus;
}
@Id
@GeneratedValue
public Integer getUser_id() {
return user_id;
}
public void setUser_id(Integer user_id) {
this.user_id = user_id;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public String getUser_password() {
return user_password;
}
public void setUser_password(String user_password) {
this.user_password = user_password;
}
}
@Entity
public class Role {
private Integer role_id;
private String role_name;
private String role_descr;
private Set<User> users;
private List<Menu> menus;
public Role() {
super();
}
public Role(Integer role_id, String role_name, String role_descr) {
super();
this.role_id = role_id;
this.role_name = role_name;
this.role_descr = role_descr;
}
@ManyToMany(targetEntity=Menu.class)
@JoinTable(name="role_menu_link",joinColumns={@JoinColumn(name="role_id")}, inverseJoinColumns={@JoinColumn(name="menu_id")})
public List<Menu> getMenus() {
return menus;
}
public void setMenus(List<Menu> menus) {
this.menus = menus;
}
@ManyToMany(targetEntity=User.class, mappedBy="roles")
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
@Id
@GeneratedValue
public Integer getRole_id() {
return role_id;
}
public void setRole_id(Integer role_id) {
this.role_id = role_id;
}
public String getRole_name() {
return role_name;
}
public void setRole_name(String role_name) {
this.role_name = role_name;
}
public String getRole_descr() {
return role_descr;
}
public void setRole_descr(String role_descr) {
this.role_descr = role_descr;
}
}
注意, 我们的user与role的关联是双向的。所以后面自动生成数据库的时候有问题!!
user与menu,role与menu都是单向的。 所以后面生成的代码没有问题!
多对多关联的中间表没有使用联合主键。
看下User和Role的关联表代码。
@Entity
@Table(name="user_role_link")
public class User_Role_Link {
private Integer id;
private User user;
private Role role;
@Id
@GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@ManyToOne(targetEntity=User.class)
@JoinColumn(name="user_id")
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@ManyToOne(targetEntity=Role.class)
@JoinColumn(name="role_id")
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
}
其他两个关联表的代码就不贴出来了。
看生成的数据库。其他表都没有问题。这个user_role_link表有问题。
它使用了联合主键。 而且id没有自增长。 user_id倒是自增长了, 真是神奇。
我们手动改下主键的主键生成策略即可。
这样就形成了权限管理的雏形。
上传一下自己的代码。。
里面还有些数据。 通过JUnit加i进去的~~ 测试过,没有问题!
下载地址:
http://download.csdn.net/detail/fj359941160/4324517