核心代码
多表只选择一方用inverse属性维护关系,默认为false(维护),true(不维护)
//角色所属的用户的集合
Set<User> users = new HashSet<User>();
//用户所属的角色的集合
Set<Role> roles = new HashSet<Role>();
<!-- 多对多关系表达
<!-- name关联的另一方集合属性名称
table中间表的名称
cascade 级联操作
inverse 维护关系
column当前对象在中间表中的外键名字
class 关联的另一方类的全路径
column 关联的另一方类在中间表的主键名 -->
<set name="roles" table="sys_user_role" cascade="save-update" inverse="false">
<key column="user_id"></key>
<many-to-many class="Role" column="role_id"></many-to-many>
</set>
<!-- 多对多关系的表达 -->
<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>
创建用户实体
package cn.zhicheng.domain;
import java.util.HashSet;
import java.util.Set;
public class Role {
private long role_id;
private String role_name;
private String role_memo;
//角色所属的用户的集合
Set<User> users = new HashSet<User>();
public long getRole_id() {
return role_id;
}
public void setRole_id(long role_id) {
this.role_id = role_id;
}
public String getRole_name() {
return role_name;
}
public void setRole_name(String role_name) {
this.role_name = role_name;
}
public String getRole_memo() {
return role_memo;
}
public void setRole_memo(String role_memo) {
this.role_memo = role_memo;
}
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
}
创建角色实体
package cn.zhicheng.domain;
import java.util.HashSet;
import java.util.Set;
public class User {
private long user_id;
private String user_code;
private String user_name;
private String user_password;
private Character user_state;
//用户所属的角色的集合
Set<Role> roles = new HashSet<Role>();
public long getUser_id() {
return user_id;
}
public void setUser_id(long user_id) {
this.user_id = user_id;
}
public String getUser_code() {
return user_code;
}
public void setUser_code(String user_code) {
this.user_code = user_code;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public String getUser_password() {
return user_password;
}
public void setUser_password(String user_password) {
this.user_password = user_password;
}
public Character getUser_state() {
return user_state;
}
public void setUser_state(Character user_state) {
this.user_state = user_state;
}
public Set<Role> getRoles() {
return roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
}
创建用户映射
<?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="cn.zhicheng.domain">
<!-- 建立数据库表与类的映射 -->
<class name="User" table="sys_user">
<!-- 建立类中属性与表中主键的对应 -->
<id name="user_id" column="user_id">
<!-- 配置主键生成策略 -->
<generator class="native"></generator>
</id>
<!-- 建立类中普通 属性对应表的字段的对应-->
<!-- property中还有 length type not-null unique 灯属性-->
<property name="user_code" ></property>
<property name="user_name" ></property>
<property name="user_password" ></property>
<property name="user_state" ></property>
<!-- 多对多关系表达 -->
<set name="roles" table="sys_user_role" cascade="save-update" inverse="false">
<key column="user_id"></key>
<many-to-many class="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 package="cn.zhicheng.domain">
<!-- 建立数据库表与类的映射 -->
<class name="Role" table="sys_role">
<!-- 建立类中属性与表中主键的对应 -->
<id name="role_id" column="role_id">
<!-- 配置主键生成策略 -->
<generator class="native"></generator>
</id>
<!-- 建立类中普通 属性对应表的字段的对应-->
<!-- property中还有 length type not-null unique 灯属性-->
<property name="role_name" ></property>
<property name="role_memo" ></property>
<!-- 多对多关系的表达 -->
<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>
在核心配置中加入映射文件
<mapping resource="cn/zhicheng/domain/Role.hbn.xml"/>
<mapping resource="cn/zhicheng/domain/User.hbn.xml"/>
编写测试类
package cn.zhicheng.many2many;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import cn.itheima.domain.Customer;
import cn.itheima.domain.LinkMan;
import cn.itheima.domain.Role;
import cn.itheima.domain.User;
import cn.itheima.utils.HibernateUtils;
public class Many2many {
@Test
/*
* 多对多表格的操作
*/
public void test(){
//获得session
Session session = HibernateUtils.openSession();
//开启事务
Transaction tx = session.beginTransaction();
//执行操作
User u1 = new User();
u1.setUser_name("用户1");
User u2 = new User();
u2.setUser_name("用户2");
Role r1 = new Role();
r1.setRole_name("角色1");
Role r2 = new Role();
r2.setRole_name("角色2");
u1.getRoles().add(r1);
u1.getRoles().add(r2);
u2.getRoles().add(r1);
u2.getRoles().add(r2);
// r1.getUsers().add(u1);
// r2.getUsers().add(u2);
// session.save(r1);
// session.save(r2);
session.save(u1);
session.save(u2);
//提交事务
tx.commit();
//释放资源
session.close();
}
@Test
/*
* 多对多表格的操作
* 删除一个用户1的一个角色1 用户1的id为1l
*/
public void test2(){
//获得session
Session session = HibernateUtils.openSession();
//开启事务
Transaction tx = session.beginTransaction();
//执行操作
User u1 = session.get(User.class, 1l);
Role r1 = session.get(Role.class, 1l);
u1.getRoles().remove(r1);
//提交事务
tx.commit();
//释放资源
session.close();
}
}