创建多对多关系表
用户表
CREATE TABLE `sys_user` (
`user_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '用户id',
`user_code` varchar(32) NOT NULL COMMENT '用户账号',
`user_name` varchar(64) NOT NULL COMMENT '用户名称',
`user_password` varchar(32) NOT NULL COMMENT '用户密码',
`user_state` char(1) NOT NULL 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) NOT NULL 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;
实体类略
xml配置文件
用户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>
<class name="com.ajth.pojo.User" table="sys_user">
<!-- 建立OID与表中主键的映射关系-->
<id name="user_id" column="cust_id">
<!-- 主键生成策略-->
<generator class="native"></generator>
</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:多对多关系映射中使用的中间表名称
-->
<set name="roles" table="sys_user_role">
<!--
column:当前对象中的属性对应中间表中的外键名称
-->
<key column="user_id"/>
<!--
class:对方类的全限定路径
column:对方的对象在中间表中的外键名称
-->
<many-to-many class="com.ajth.pojo.Role" column="role_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
角色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>
<class name="com.ajth.pojo.Role" table="sys_role">
<!-- 建立OID与表中主键的映射关系-->
<id name="role_id" column="role_id">
<!-- 主键生成策略-->
<generator class="native"></generator>
</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">
<!--
column:当前对象中的属性对应中间表中的外键名称
-->
<key column="role_id"/>
<!--
class:对方类的全限定路径
column:对方的对象在中间表中的外键名称
-->
<many-to-many class="com.ajth.pojo.User" column="user_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
测试
@Test
public void demo1(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
User user1 = new User();
user1.setUser_name("张三");
user1.setUser_state("1");
user1.setUser_code("zhangsan");
user1.setUser_password("123456");
Role role1 = new Role();
role1.setRole_name("admin用户");
Role role2 = new Role();
role2.setRole_name("普通用户");
user1.getRoles().add(role1);
session.save(user1);
session.save(role1);
transaction.commit();
}