Hibernate的NVN的关联关系,实现一套CRUD?

示例:用户、角色、菜单表的权限管理(NVN可以看成是多个1VN)

一、数据库要求:

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

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

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

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

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

二、实体类(只需要创建三个实体即可,关系表不需创建):

1、用户表Users.java的实体类(封装继承省略):


	/**
	 * 用户表ID
	 */
	private String uid;
	/**
	 * 用户名称
	 */
	private String uname;
	/**
	 * 保存N个角色,set集合唯一性,transient去除不必要的属性值
	 */
	private Set<Roles> sr = new HashSet<>();

2、 角色表Roles.java的实体类(封装继承省略):

	/**
	 * 角色表ID
	 */
	private String rid;
	/**
	 * 角色名称
	 */
	private String rname;
	/**
	 * 用来保存N个用户,set集合唯一性,transient去除不必要的属性值
	 */
	private transient Set<Users> su = new HashSet<>();
	/*
	 * 用来保存N个菜单
	 */
	private Set<Menu> sm = new HashSet<>();

3、 菜单表Menu.java的实体类(封装继承省略):

	/**
	 * 菜单表ID
	 */
	private String mid;
	/**
	 * 菜单名称
	 */
	private String mname;
	/**
	 * 保存N个角色,transient去除不必要的属性值
	 */
	private transient Set<Roles> sr = new HashSet<>();

三、配置映射文件:

在src/main/resources路径下创建连接数据库的hibernate.cfg.xml文件,具体如下:

<?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</property>
		<property name="hibernate.connection.username">root</property>
        
        <!-- 显示sql语句 -->
        <property name="show_sql">true</property>
        <!-- 格式化sql语句 -->
        <property name="format_sql"></property>
        
        <!-- 配置映射 -->
		<mapping resource="com/zking/hibernate06/entity/Users.hbm.xml" />
		<mapping resource="com/zking/hibernate06/entity/Roles.hbm.xml" />
		<mapping resource="com/zking/hibernate06/entity/Menu.hbm.xml" />
	</session-factory>
</hibernate-configuration>

在src/main/java路径下创建连接数据库的三个实体类的映射文件,具体如下:

注意点:Inverse属性:hibernate仅仅按照主控方对象的状态的变化来同步更新数据库。inverse="true"是主控方给对面。

cascade="save-update":级联保存,但是不会级联删除。

用户表的映射文件(Users.hbm.xml):

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-9-11 11:44:16 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
	<class name="com.zking.hibernate06.entity.Users" table="USERS">
		<id name="uid" type="java.lang.String">
			<column name="UID" />
			<generator class="assigned" />
		</id>
		<property name="uname" type="java.lang.String">
			<column name="UNAME" />
		</property>

		<!-- 配置与角色表的连级关系 -->
		<set name="sr" table="UsersRoles" lazy="true" inverse="true"
			cascade="save-update">
			<key column="uid"></key>
			<many-to-many class="com.zking.hibernate06.entity.Roles"
				column="rid"></many-to-many>
		</set>

	</class>
</hibernate-mapping>

角色表的映射文件(Roles.hbm.xml):

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-9-11 11:44:16 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
	<class name="com.zking.hibernate06.entity.Roles" table="ROLES">
		<id name="rid" type="java.lang.String">
			<column name="RID" />
			<generator class="assigned" />
		</id>
		<property name="rname" type="java.lang.String">
			<column name="RNAME" />
		</property>
		<!-- 配置与用户表的连级关系 -->
		<set name="su" table="UsersRoles" lazy="true">
			<key column="rid"></key>
			<many-to-many class="com.zking.hibernate06.entity.Users"
				column="uid"></many-to-many>
		</set>

		<!-- 配置与菜单表的连级关系 -->
		<set name="sm" table="RolesMenu" inverse="true" cascade="save-update">
			<key column="rid"></key>
			<many-to-many class="com.zking.hibernate06.entity.Menu"
				column="mid"></many-to-many>
		</set>
	</class>
</hibernate-mapping>

菜单表的映射文件(Menu.hbm.xml):

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-9-11 11:44:16 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
	<class name="com.zking.hibernate06.entity.Menu" table="MENU">
		<id name="mid" type="java.lang.String">
			<column name="MID" />
			<generator class="guid" />
		</id>
		<property name="mname" type="java.lang.String">
			<column name="MNAME" />
		</property>

		<!-- 配置与角色表的连级关系 -->
		<set name="sr" table="RolesMenu">
			<key column="mid"></key>
			<many-to-many class="com.zking.hibernate06.entity.Roles"
				column="rid"></many-to-many>
		</set>

	</class>
</hibernate-mapping>

四、测试类中实现CRUD:

private Configuration configuration;
	private SessionFactory sessionFactory;
	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: add
	 * @Description: 新增数据的方法
	 * @return void
	 */
	// @Test
	public void add() {

		// 调用最开始执行的方法
		before();

		// 给用户表赋值
		Users u = new Users();
		u.setUid("Chen01");
		u.setUname("chenchao");

		// 给角色表赋值
		Roles r1 = new Roles();
		r1.setRid("Admin01");
		r1.setRname("Admin");
		Roles r2 = new Roles();
		r2.setRid("SystemAdmin01");
		r2.setRname("SystemAdmin");

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

		// 给菜单表赋值
		Menu m1 = new Menu();
		m1.setMname("Admin的菜单1");
		Menu m2 = new Menu();
		m2.setMname("Admin的菜单2");

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

		// 保存
		session.saveOrUpdate(u);

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

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

		// 得到指定用户
		Users u = session.get(Users.class, "76d9c3b9-b58a-11e8-8972-80fa5b5015f0");
		// 转为JSON格式
		String out = JSON.toJSONString(u);
		// 输出
		System.out.println(out);

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

	/**
	 * 
	 * @Title: remove
	 * @Description:删除数据的方法
	 * @return void
	 */
	// @Test
	public void remove() {
		// 调用最开始执行的方法
		before();

		// 得到用户
		Users users = session.get(Users.class, "Chen01");
		// 得到当前用户所对应的所有角色
		Set<Roles> sr = users.getSr();
		for (Roles r : sr) {
			if (r.getRname().equals("Admin")) {
				r.getSu().remove(users);
			}
			// r.getSu().remove(users);
		}

		session.update(users);

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

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值