现在的位置: 首页 > 综合 > 正文

权限管理中使用Hibernate Annotation的多对多关联

2013年01月11日 ⁄ 综合 ⁄ 共 4144字 ⁄ 字号 评论关闭

这次写了一个基于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

 

抱歉!评论已关闭.