这次写了一个基于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; } }
Role表:
@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