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 sr = new HashSet<>();
2、 角色表Roles.java的实体类(封装继承省略):
/*** 角色表ID*/private String rid;/*** 角色名称*/private String rname;/*** 用来保存N个用户,set集合唯一性,transient去除不必要的属性值*/private transient Set su = new HashSet<>();/** 用来保存N个菜单*/private Set
3、 菜单表Menu.java的实体类(封装继承省略):
/*** 菜单表ID*/private String mid;/*** 菜单名称*/private String mname;/*** 保存N个角色,transient去除不必要的属性值*/private transient Set sr = new HashSet<>();
三、配置映射文件:
在src/main/resources路径下创建连接数据库的hibernate.cfg.xml文件,具体如下:
com.mysql.jdbc.Driver sasa jdbc:mysql://localhost:3306/test root true
在src/main/java路径下创建连接数据库的三个实体类的映射文件,具体如下:
注意点:Inverse属性:hibernate仅仅按照主控方对象的状态的变化来同步更新数据库。inverse="true"是主控方给对面。
cascade="save-update":级联保存,但是不会级联删除。
用户表的映射文件(Users.hbm.xml):
角色表的映射文件(Roles.hbm.xml):
菜单表的映射文件(Menu.hbm.xml):
四、测试类中实现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*/// @Testpublic 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*/// @Testpublic 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*/// @Testpublic void remove() {// 调用最开始执行的方法before();// 得到用户Users users = session.get(Users.class, "Chen01");// 得到当前用户所对应的所有角色Set sr = users.getSr();for (Roles r : sr) {if (r.getRname().equals("Admin")) {r.getSu().remove(users);}// r.getSu().remove(users);}session.update(users);// 调用最后执行的方法after();}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
