Hibernate多对多关系的配置
1.创建表
用户表
CREATE TABLE `sys_user` (
`user_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '用户id',
`user_code` varchar(32) COMMENT '用户账号',
`user_name` varchar(64) COMMENT '用户名称',
`user_password` varchar(32) COMMENT '用户密码',
`user_state` char(1) COMMENT '1:正常,0:暂停',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
角色表
CREATE TABLE `sys_role` (
`role_id` bigint(32) NOT NULL AUTO_INCREMENT,
`role_name` varchar(32) COMMENT '角色名称',
`role_memo` varchar(128) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`role_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
中间表
CREATE TABLE `sys_user_role` (
`role_id` bigint(32) NOT NULL COMMENT '角色id',
`user_id` bigint(32) NOT NULL COMMENT '用户id',
PRIMARY KEY (`role_id`,`user_id`),
KEY `FK_user_role_user_id` (`user_id`),
CONSTRAINT `FK_user_role_role_id` FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`role_id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `FK_user_role_user_id` FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`user_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.创建实体
3创建映射
用户的映射
<?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">
<!--类与表的映射关系 lazy是延迟加载-->
<hibernate-mapping>
<class name="com.wangshi.hibernate.test03.User" table="sys_user" lazy="true">
<!--类与表的主键-->
<id name="user_id" column="user_id">
<generator class="native" />
</id>
<!--普通属性-->
<property name="user_code" column="user_code"></property>
<property name="user_name" column="user_name"></property>
<property name="user_password" column="user_password"></property>
<property name="user_state" column="user_state"></property>
<!-- 建立角色的多对多的映射关系 set标签
name:对方的集合的属性名称 table中间表名称
fetch:抓取策略,控制SQL语句格式-->
<set name="roles" table="sys_user_role" cascade="save-update,delete" fetch="join" >
<!-- 当前的对象对应中间表的外键的名称 -->
<key column="user_id" />
<!-- class:对方类的全路径 column 中间表的外键名称 -->
<many-to-many class="com.wangshi.hibernate.test03.Role" column="role_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
角色的映射
<?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>
<class name="com.wangshi.hibernate.test03.Role" table="sys_role">
<!--类与表的主键-->
<id name="role_id" column="role_id">
<generator class="native" />
</id>
<!--普通属性-->
<property name="role_name" column="role_name"></property>
<property name="role_memo" column="role_memo"></property>
<!-- 建立角色的多对多的映射关系 set标签 name:对方的集合的属性名称 table中间表名称-->
<set name="users" table="sys_user_role" cascade="save-update,delete" inverse="true">
<!-- 当前的对象对应中间表的外键的名称 -->
<key column="role_id" />
<!-- class:对方类的全路径 column 中间表的外键名称 -->
<many-to-many class="com.wangshi.hibernate.test03.User" column="user_id" />
</set>
</class>
</hibernate-mapping>
4编写测试类
@Test
//保存多条记录:保存多个用户和角色
public void test01(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//创建两个用户
User user1 = new User();
user1.setUser_name("云尊");
User user2 = new User();
user2.setUser_name("武尊");
//创建三个角色
Role role1 = new Role();
role1.setRole_name("研发部");
Role role2 = new Role();
role2.setRole_name("市场部");
Role role3 = new Role();
role3.setRole_name("公关部");
//设置双向的关联关系
user1.getRoles().add(role1);
user1.getRoles().add(role2);
user2.getRoles().add(role2);
user2.getRoles().add(role3);
role1.getUsers().add(user1);
role2.getUsers().add(user1);
role2.getUsers().add(user2);
role3.getUsers().add(user2);
//保存操作:多对多建立了双向的关系必须有一方放弃外键维护 inverse
//一般是被动方放弃 维护权限 cascade="save-update,delete" 级联
session.save(user1);
session.save(user2);
session.save(role1);
session.save(role2);
session.save(role3);
tx.commit();
}
Hibernate的多对多的操作
1.只保存一边是否可以
@Test
//多对多操作只保存一边是否可以
//级联 保存
public void test02(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//创建用户和角色
User user = new User();
user.setUser_name("追风");
Role role = new Role();
role.setRole_name("研发部");
//设置关系
user.getRoles().add(role);
role.getUsers().add(user);
//单向保存
//session.save(user);
session.save(role);
tx.commit();
}
多对多的级联删除(基本用不上)
@Test
//多对多的级联删除(基本用不上)
public void test03(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//查询4号用户 删除
User user = session.get(User.class, 4l);
session.delete(user);
tx.commit();
}
多对多的其他的操作
给用户选择角色
@Test
//给用户选择角色
public void test04(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//给一号用户多选2号角色
//查询一号用户
User user = session.get(User.class, 1l);
//查询2号角色
Role role = session.get(Role.class, 2l);
user.getRoles().add(role);
tx.commit();
}
给用户改选角色
@Test
//给用户改选角色
public void test5(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//给2号用户的2号角色改3号角色
//查询2号用户
User user = session.get(User.class, 2l);
//查询2号角色
Role role = session.get(Role.class, 2l);
Role role2 = session.get(Role.class, 3l);
user.getRoles().remove(role);
user.getRoles().add(role2);
tx.commit();
}
给用户删除角色
@Test
//给用户删除角色
public void test6(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//给2号用户删除1号角色
//查询2号用户
User user = session.get(User.class, 2l);
//查询3号角色
Role role = session.get(Role.class, 3l);
user.getRoles().remove(role);
tx.commit();
}