SSH与SSM学习之hibernate20——多对多操作
来源:互联网 发布:成都网络推广公司排名 编辑:程序博客网 时间:2024/06/11 04:28
- SSH与SSM学习之hibernate20多对多操作
- 一说明
- 二 用户员工实体
- 1 Userjava
- 2 Userhbmxml
- 三角色实体
- 1 Rolejava
- 2 Rolehbmxml
- 四保存用户以及角色
- 1 产生的问题以及解决
- 2 代码实例
- 3 结果
- 五为用户添加角色
- 1 问题说明
- 2 示例代码
- 3 结果
- 六为用户删除角色
- 1 示例代码
- 2 结果
SSH与SSM学习之hibernate20——多对多操作
一、说明
关于多对多的关系可以查看 SSH与SSM学习之hibernate16——表与表的三种关系。
这里我们涉及到的是 用户(员工)与角色之间的多对多的关系。
二、 用户(员工)实体
2.1 User.java
** * @author:qiwenming * @date:2017/9/19 0019 20:57 * @description: * 用户类 */public class User { private Long user_id; private String user_code; private String user_name; private String user_password; private Character user_state; //表达多对多关系 private Set<Role> roles = new HashSet<>(); ....省略了get/set方法...}
2.2 User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.qwm.hibernate03.domain" > <class name="User" table="sys_user" > <id name="user_id" > <generator class="native"></generator> </id> <property name="user_code" ></property> <property name="user_name" ></property> <property name="user_password" ></property> <property name="user_state" ></property> <!-- 多对多关系表达 --> <!-- name: 集合属性名 table: 配置中间表名 key |-column:外键,别人引用"我"的外键列名 class: 我与哪个类是多对多关系 column:外键.我引用比人的外键列名 --> <set name="roles" table="sys_user_role"> <!----> <key column="user_id"></key> <many-to-many class="Role" column="role_id"></many-to-many> </set> </class></hibernate-mapping>
三、角色实体
3.1 Role.java
public class Role { private Long role_id; private String role_name; private String role_memo; //表达多对对关系 private Set<User> users = new HashSet<>(); ....省略了get/set方法...}
3.2 Role.hbm.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.qwm.hibernate03.domain" > <class name="Role" table="sys_role" > <id name="role_id" > <generator class="native"></generator> </id> <property name="role_name" ></property> <property name="role_memo" ></property> <!-- 多对多关系表达 --> <!-- name: 集合属性名 table: 配置中间表名 key |-column:外键,别人引用"我"的外键列名 class: 我与哪个类是多对多关系 column:外键.我引用比人的外键列名 --> <set name="users" table="sys_user_role" inverse="true"> <key column="role_id"></key> <many-to-many class="User" column="user_id"></many-to-many> </set> </class></hibernate-mapping>
四、保存用户以及角色
4.1 产生的问题以及解决
注意: 这里我们保存用户与角色的数据的时候,需要注意,二者默认都是维护着关系的,就会导致二者都会相互之间添加到维护他们两者之间关系的表中,这样就会产生主键冲突,导致无法数据添加失败。
解决方式有两种:
第一种 我们在添加数据关系的时候,只添加一方的关系,不添添加另一方的关系
如:
//3.3表达关系 user1.getRoles().add(role1); user1.getRoles().add(role2); user2.getRoles().add(role1); user2.getRoles().add(role2);// role1.getUsers().add(user1);// role1.getUsers().add(user2);// role2.getUsers().add(user1);// role2.getUsers().add(user2);
或者
//3.3表达关系// user1.getRoles().add(role1);// user1.getRoles().add(role2);// user2.getRoles().add(role1);// user2.getRoles().add(role2); role1.getUsers().add(user1); role1.getUsers().add(user2); role2.getUsers().add(user1); role2.getUsers().add(user2);
第二种 这种方式就是配置一方放弃维护关系,可以配置到 User 中,也可以配置到 Role中,
如
如果是 Role.hbm.xml
....<set name="users" table="sys_user_role" inverse="true"> <key column="role_id"></key> <many-to-many class="User" column="user_id"></many-to-many></set>...
或者
如果是 User.hbm.xml
......<set name="roles" table="sys_user_role" inverse="true"> <!----> <key column="user_id"></key> <many-to-many class="Role" column="role_id"></many-to-many></set>......
下面的例子中,我们采用的是配置文件中 Role放弃维护关系,就是上面我们的完整配置
4.2 代码实例
/** * 保存用户以及角色 */@Testpublic void test1(){ //1.创建session Session session = HibernateUtils.openSession(); //2.开启事务 Transaction t = session.beginTransaction(); //=================================== //3.操作 //3.1创建两个用户 User user1 = new User(); user1.setUser_name("高晓明"); User user2 = new User(); user2.setUser_name("李志锋") ; //3.2创建两角色 Role role1 = new Role(); role1.setRole_name("保安"); Role role2 = new Role(); role2.setRole_name("清洁工"); //3.3表达关系 user1.getRoles().add(role1); user1.getRoles().add(role2); user2.getRoles().add(role1); user2.getRoles().add(role2); role1.getUsers().add(user1); role1.getUsers().add(user2); role2.getUsers().add(user1); role2.getUsers().add(user2); //3.4数据持久化 session.save(user1); session.save(user2); session.save(role1); session.save(role2); //=================================== //4.提交事务 t.commit(); //5.关闭资源 session.close();}
4.3 结果
用户表
角色表
用户-角色表
五、为用户添加角色
5.1 问题说明
我们为用户保存角色的时候,有两种方式处理
第一种:我们自己保存角色
例如
user.getRoles().add(role);session.save(role);
第二种:再我们的user.hbm.xml中配置级联保存
例如
<set name="roles" table="sys_user_role" cascade="save-update"> <!----> <key column="user_id"></key> <many-to-many class="Role" column="role_id"></many-to-many></set>
这里我们使用的是第一种方式
5.2 示例代码
/** * 为用户添加角色 * 我们来实现为 “高晓峰”添加一个“部门经理”的角色 */@Testpublic void test2(){ //1.创建session Session session = HibernateUtils.openSession(); //2.开启事务 Transaction t = session.beginTransaction(); //=================================== //3.操作 //3.1 得到高晓峰这个用户 User user = session.get(User.class,1L); //3.2 创建“部门经理”这个角色 Role role = new Role(); role.setRole_name("部门经理"); //3.3 给高晓峰添加“部门经理”这个角色 //这里不用调用保存的方法,保存user,因为user是持久化对象 user.getRoles().add(role);// session.save(role); //=================================== //4.提交事务 t.commit(); //5.关闭资源 session.close();}
5.3 结果
六、为用户删除角色
6.1 示例代码
/** * 为用户删除角色 * 我们来实现为 “高晓峰”删除“清洁工”和“保安”的角色 */@Testpublic void test3(){ //1.创建session Session session = HibernateUtils.openSession(); //2.开启事务 Transaction t = session.beginTransaction(); //=================================== //3.操作 //3.1获取到用户 //3.2获取到“清洁工”这个角色 //3.3获取到“保安”这个角色 //3.4从用户的角色集合中删除“保安”和“清洁工” User user = session.get(User.class,1L); Role role1 = session.get(Role.class,1L); Role role2 = session.get(Role.class,2L); //user是持久化对象那个,所以不用调用保存的方法 user.getRoles().remove(role1); user.getRoles().remove(role2); //=================================== //4.提交事务 t.commit(); //5.关闭资源 session.close();}
6.2 结果
阅读全文
0 0
- SSH与SSM学习之hibernate20——多对多操作
- SSH与SSM学习之hibernate17——多对一一对多简单操作
- SSH与SSM学习之hibernate18——多对一一对多级联操作
- SSH与SSM学习之hibernate19——多对一一对多关系维护
- SSH与SSM学习之SSH整合08——Spring整合Hibernate环境操作数据库
- SSH与SSM学习之hibernate04——Configuration
- SSH与SSM学习之hibernate05——SessionFactory
- SSH与SSM学习之hibernate06——Session
- SSH与SSM学习之hibernate07——Transaction
- SSH与SSM学习之hibernate13——HQL查询
- SSH与SSM学习之hibernate14——Criteria查询
- SSH与SSM学习之hibernate21——离线查询
- SSH与SSM学习之hibernate25——批量抓取
- SSH与SSM学习之Struts206——参数获取
- SSH与SSM学习之Struts211——拦截器
- SSH与SSM学习之Struts212——标签
- SSH与SSM学习之Spring15——cglib代理
- SSH与SSM学习之SSH整合01——SSH整合原理和导包
- [经验] C语言关键字中static,volatile,const,extern,return含义及作用?
- 有return 0 为什么出错还正常显示;为什么不溢出显示-32768
- 51nod 1018 排序
- Linux文件系统之一:inode节点和inode节点包含的block寻址信息
- git fatal: Unable to find remote helper for 'https'
- SSH与SSM学习之hibernate20——多对多操作
- 《Volley源码分析》Part2、Volley源码解析
- LeetCode 169. Majority Element (Easy)
- 插件化实践
- Python读取系统文件夹内所有文件并统计数量
- MongoDB缓存技术总结
- 最短路径
- java学习基础第一篇
- Python获取指定目录下文件数量及总大小