在Mavne环境下,实现struts2和hibernate的NVN关系的注解式开发?

示例:用户、角色、菜单表的权限管理。

一、数据库要求:

1、用户表users:uid用户编号、uname用户名称

2、用户角色表usersRoles:uid用户编号、rid角色编号

3、角色表roles:rid角色编号、rname角色名称

4、角色菜单表rolesMenu:rid角色编号、mid菜单编号

5、菜单表menu:mid菜单编号、mname菜单名称

二、创建实体类:

1、用户实体类Users.java:

@Entity // 指名该类为实体类
@Table(name = "users") // 对应数据库表users
public class Users {

	/**
	 * 用户编号
	 */
	@Id // 指名该列名为ID
	@GenericGenerator(name = "myid", strategy = "guid")
	@GeneratedValue(generator = "myid")
	private String uid;

	/**
	 * 用户名称
	 */
	@Column(name = "uname")
	private String uname;

	/**
	 * 用户保存N个角色的set集合
	 */
	@ManyToMany(targetEntity = Roles.class)
	@Cascade(value = { CascadeType.SAVE_UPDATE })
	@JoinTable(name = "usersroles", joinColumns = @JoinColumn(name = "uid"), inverseJoinColumns = @JoinColumn(name = "rid"))
	private Set<Roles> sr = new HashSet<>();

	/**
	 * 
	 * 创建一个新的实例 Users.
	 *
	 */
	public Users() {
		super();
	}

	/**
	 * 
	 * 创建一个新的实例 Users.
	 *
	 * @param uid
	 * @param uname
	 * @param sr
	 */
	public Users(String uid, String uname, Set<Roles> sr) {
		super();
		this.uid = uid;
		this.uname = uname;
		this.sr = sr;
	}

	public String getUid() {
		return uid;
	}

	public void setUid(String uid) {
		this.uid = uid;
	}

	public String getUname() {
		return uname;
	}

	public void setUname(String uname) {
		this.uname = uname;
	}

	public Set<Roles> getSr() {
		return sr;
	}

	public void setSr(Set<Roles> sr) {
		this.sr = sr;
	}

}

2、角色实体类Roles.java:

@Entity // 指名该类为实体类
@Table(name = "roles") // 对应数据库表roles
public class Roles {

	/**
	 * 角色编号
	 */
	@Id // 指名该列名为ID
	@GenericGenerator(name = "myid", strategy = "guid")
	@GeneratedValue(generator = "myid")
	private String rid;

	/**
	 * 角色名称
	 */
	@Column(name = "rname")
	private String rname;

	/**
	 * 用来保存N个用户,set集合唯一性,transient去除不必要的属性值
	 */
	@ManyToMany(targetEntity = Users.class)
	@Cascade(value = { CascadeType.SAVE_UPDATE })
	@JoinTable(name = "usersroles", joinColumns = @JoinColumn(name = "uid"), inverseJoinColumns = @JoinColumn(name = "rid"))
	private transient Set<Users> su = new HashSet<>();

	/**
	 * 用于保存N个菜单
	 */
	@ManyToMany(targetEntity = Menu.class)
	@Cascade(value = { CascadeType.SAVE_UPDATE })
	@JoinTable(name = "rolesmenu", joinColumns = @JoinColumn(name = "rid"), inverseJoinColumns = @JoinColumn(name = "mid"))
	private Set<Menu> sm = new HashSet<>();

	/**
	 * 
	 * 创建一个新的实例 Roles.
	 *
	 */
	public Roles() {
		super();
	}

	public Roles(String rid, String rname, Set<Users> su, Set<Menu> sm) {
		super();
		this.rid = rid;
		this.rname = rname;
		this.su = su;
		this.sm = sm;
	}

	public String getRid() {
		return rid;
	}

	public void setRid(String rid) {
		this.rid = rid;
	}

	public String getRname() {
		return rname;
	}

	public void setRname(String rname) {
		this.rname = rname;
	}

	public Set<Users> getSu() {
		return su;
	}

	public void setSu(Set<Users> su) {
		this.su = su;
	}

	public Set<Menu> getSm() {
		return sm;
	}

	public void setSm(Set<Menu> sm) {
		this.sm = sm;
	}

}

 3、菜单实体类Menu.java:

@Entity // 指名该类为实体类
@Table(name = "menu") // 对应数据库表menu
public class Menu {

	/**
	 * 菜单编号
	 */
	@Id // 指名ID
	@GenericGenerator(name = "myid", strategy = "guid")
	@GeneratedValue(generator = "myid")
	private String mid;

	/**
	 * 菜单名称
	 */
	@Column(name = "mname")
	private String mname;

	/**
	 * 保存N个角色,transient去除不必要的属性值
	 */
	@ManyToMany(targetEntity = Roles.class)
	@Cascade(value = { CascadeType.SAVE_UPDATE })
	@JoinTable(name = "rolesmenu", joinColumns = @JoinColumn(name = "rid"), inverseJoinColumns = @JoinColumn(name = "mid"))
	private transient Set<Roles> sr = new HashSet<>();

	public Menu() {
		super();
	}

	public Menu(String mid, String mname, Set<Roles> sr) {
		super();
		this.mid = mid;
		this.mname = mname;
		this.sr = sr;
	}

	public String getMid() {
		return mid;
	}

	public void setMid(String mid) {
		this.mid = mid;
	}

	public String getMname() {
		return mname;
	}

	public void setMname(String mname) {
		this.mname = mname;
	}

	public Set<Roles> getSr() {
		return sr;
	}

	public void setSr(Set<Roles> sr) {
		this.sr = sr;
	}

}

三、创建hibernate.cfg.xml配置文件(src/main/resources路径下)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.password">sasa</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8</property>
		<property name="hibernate.connection.username">root</property>
		
		<!-- 显示sql语句 -->
		<property name="show_sql">true</property>
		<!-- 格式化sql语句 -->
		<property name="format_sql">true</property>

		<!-- 配置映射:引入实体类-->
		<mapping class="com.zking.struts2_hibernate.entity.Users" />
		<mapping class="com.zking.struts2_hibernate.entity.Roles" />
		<mapping class="com.zking.struts2_hibernate.entity.Menu" />
	</session-factory>
</hibernate-configuration>

四、创建实现方法的类UsersAction.java:

@Results({ @Result(name = "success", location = "/index.jsp"), @Result(name = "error", location = "/404.jsp") }) // 跳转页面
public class UsersAction {

	// 创建Configuration
	private Configuration configuration;
	// 创建SessionFactory
	private SessionFactory sessionFactory;
	// 创建Session
	private Session session;
	// 创建事务
	private Transaction transaction;

	/**
	 * 
	 * @Title: before
	 * @Description:最开始执行的方法
	 * @return void
	 */
	public void before() {
		configuration = new Configuration().configure();
		sessionFactory = configuration.buildSessionFactory();
		session = sessionFactory.openSession();
		transaction = session.beginTransaction();
	}

	/**
	 * 
	 * @Title: after
	 * @Description:最后执行的方法
	 * @return void
	 */
	public void after() {
		transaction.commit();
		session.close();
		sessionFactory.close();
	}

	/**
	 * 
	 * @Title: addUser
	 * @Description: 新增数据
	 * @return void
	 */
	@Action("addUser")
	public void addUser() {
		// 调用最开始执行的方法
		before();

		// 创建users表对象
		Users u = new Users();
		u.setUname("chenchao");

		// 创建roles表对象
		Roles r1 = new Roles();
		r1.setRname("student");
		Roles r2 = new Roles();
		r2.setRname("staff");

		// 用户表和角色表互相设值
		u.getSr().add(r1);
		u.getSr().add(r2);
		r1.getSu().add(u);
		r2.getSu().add(u);

		// 创建menu表对象
		Menu m1 = new Menu();
		m1.setMname("attend class");
		Menu m2 = new Menu();
		m2.setMname("be on duty");

		// 角色表和菜单表互相设值
		r1.getSm().add(m1);
		r2.getSm().add(m2);
		m1.getSr().add(r1);
		m2.getSr().add(r2);

		// 保存
		session.save(u);

		// 调用最后执行的方法
		after();
	}

	/**
	 * 
	 * @Title: findRolesAll
	 * @Description: 查询数据
	 * @return void
	 */
	@Action("findRolesAll")
	public void findRolesAll() throws Exception {
		// 调用最开始执行的方法
		before();

		@SuppressWarnings("unchecked")
		// 得到集合信息
		List<Users> luser = session.createQuery(" from Users").list();
		// 转为JSON格式
		String out = JSON.toJSONString(luser);

		System.out.println(out);

		// 打印到页面
		ServletActionContext.getResponse().getWriter().println(out);
		// 刷新
		ServletActionContext.getResponse().getWriter().flush();
		// 关闭
		ServletActionContext.getResponse().getWriter().close();
	}

}

五、创建index.jsp页面,用来获取后台数据(使用ajax):

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery-3.2.1.js"></script>
<script type="text/javascript">
$(function(){
	dataBind();
});

function dataBind(){
	$.ajax({
	type : "post",
	dataType : "json",
	data : {
		t : new Date()
	},
	url : "findRolesAll",//访问数据地址
    success : function(date) {

    	var table='<table align="center" width="80%"><tr><td>用户名</td><td>角色名</td><td>菜单名</td></tr>';
    	
    	$.each(date,function(index,item){//循环用户表信息
    		console.log(item);//打印

    		 table+="<tr><td>"+item.uname+"</td><td></td><td></td></tr>";
    		 
    		 	$.each(item.sr,function(index,item){//循环角色表信息

    	    		 table+="<tr><td></td><td>"+item.rname+"</td><td></td></tr>";
    	    		 
    	    		 $.each(item.sm,function(index,item){//循环菜单表信息

    	    	    		 table+="<tr><td></td><td></td><td>"+item.mname+"</td></tr>";
    	    	    	});
    	    		 
    	    	});
    		 
    	});
    	
	    table+="</table>";

	    $('#div1').html(table);
        }
    });
}

</script>
</head>
<body>
	<div id="div1"></div>
</body>
</html>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值