這次寫了一個基於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