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();
}