示例:用户、角色、菜单表的权限管理(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();
}