1.实体类的多对多的关系映射
一个用户可以有多个角色
User.java
public class User { private Long user_id; private String user_code; private String user_name; private String user_password; private String user_state; // 设置多对多关系:表示一个用户选择多个角色? // 放置的是角色的集合 private Set<Role> roles = new HashSet<Role>();
}
Role.java
public class Role {
private Long role_id;
private String role_name;
private String role_memo;
// 一个角色被多个用户选择:
// 放置的是用户的集合
}
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>
<class name="com.work.entity.User" table="sys_user">
<!-- 建立OID与主键的映射 -->
<id name="user_id" column="user_id">
<generator class="native"/>
</id>
<!-- 建立普通属性与字段映射 -->
<property name="user_code" column="user_code"/>
<property name="user_name" column="user_name"/>
<property name="user_password" column="user_password"/>
<property name="user_state" column="user_state"/>
<!-- 建立与角色的多对多的映射关系 -->
<!--
set标签
* name :对方的集合的属性名称。
* table :多对多的关系需要使用中间表,放的是中间表的名称。
-->
<set name="roles" table="sys_user_role" cascade="save-update,delete" >
<!--
key标签:
* column :当前的对象对应中间表的外键的名称。
-->
<key column="user_id"/>
<!--
many-to-many标签:
* class :对方的类的全路径
* column :对方的对象在中间表中的外键的名称。
-->
<many-to-many class="com.work.entity.Role" column="role_id"/>
</set>
</class>
</hibernate-mapping>
LinkMan.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>
<class name="com.work.entity.Role" table="sys_role">
<!-- 建立OID与主键的映射 -->
<id name="role_id" column="role_id">
<generator class="native"/>
</id>
<!-- 建立普通属性与字段的映射 -->
<property name="role_name" column="role_name"/>
<property name="role_memo" column="role_memo"/>
<!-- 与用户的多对多的映射关系 -->
<!--
set标签
* name :对方的集合的属性名称。
* table :多对多的关系需要使用中间表,放的是中间表的名称。
-->
<set name="users" table="sys_user_role" cascade="save-update,delete" inverse="true">
<!--
key标签:
* column :当前的对象对应中间表的外键的名称。
-->
<key column="role_id"/>
<!--
many-to-many标签:
* class :对方的类的全路径
* column :对方的对象在中间表中的外键的名称。
-->
<many-to-many class="com.work.entity.User" column="user_id"/>
</set>
</class>
</hibernate-mapping>
3.多对多的级联操作
1>保存多个用户,每个用户有多个角色
必须有一方放弃主键的维护,一般都是被动的一方放弃
/**
* 多对多的级联保存
*/
@Test
public void save() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
User user1 = new User();
User user2 = new User();
user1.setUser_name("lq");
user2.setUser_name("xj");
Role role1 = new Role();
Role role2 = new Role();
Role role3 = new Role();
role1.setRole_name("开发部");
role2.setRole_name("研发部");
role3.setRole_name("传销部");
user1.getRoles().add(role1);
user1.getRoles().add(role2);
user2.getRoles().add(role2);
user2.getRoles().add(role3);
session.save(user1);
session.save(user2);
tx.commit();
}
2>通过级联操作只需要对一方进行更新
保存级联操作:保存客户客户对应的联系人也保存了
/**
* 多对多的级联更新
*/
@Test
public void update() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
User user = session.get(User.class, 11L);
Role role = session.get(Role.class, 11L);
//不需要跟新hibernate持久化状态的数据会自动更新到数据库
user.getRoles().add(role);
tx.commit();
}
删除级联操作:删除用户用户对应的角色也删除了,而且角色对应的用户也会被删除(级联删除是不会使用的)
/**
* 多对多的级联删除
*/
@Test
public void delete() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
User user = session.get(User.class, 9L);
session.delete(user);
tx.commit();
}
3>更新级联操作
@Test
public void update() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//进行级联更新
Customer customer = session.get(Customer.class, 3L);
LinkMan linkMan = session.get(LinkMan.class, 5l);
//关联
customer.getLinkMans().add(linkMan);
linkMan.setCustomer(customer);
session.update(customer);
tx.commit();
}