權限管理中使用Hibernate Annotation的多對多關聯

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





 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章