Hibernate完成多对多的关联关系映射

来源:互联网 发布:网络名称大全5个字 编辑:程序博客网 时间:2024/06/05 01:48
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>();//省略set/get方法

public class Role {private Long role_id;private String role_name;private String role_memo;//一个角色包含多个用户private Set<User> users=new HashSet<User>();//省略set/get方法

角色的映射:<?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="cn.itcast.domain.Role" table="crm_sys_role"><id name="role_id" column="role_id"><generator class="native"/></id><property name="role_name"/><property name="role_memo"/><!-- inverse属性true:放弃维护外键关系结论:将来在开发中,如果遇到多对多的关系,一定要选择一方放弃维护关系 --><!-- cascade级联操作save-update:级联保存更新delete:级联删除all:级联保存更新+级联删除结论:cascade简化代码,该属性不使用无所谓,建议要用之用save-update --><set name="users" table="crm_sys_user_role" inverse="true"><key column="role_id"/><many-to-many class="cn.itcast.domain.User" column="user_id"/></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="cn.itcast.domain.User" table="crm_sys_user"><id name="user_id" column="user_id"><generator class="native"></generator></id><property name="user_code"/><property name="user_name"/><property name="user_password"/><property name="user_state"/><!-- set标签name:关联的另一方的集合的属性名称table:中间表的名称 --><set name="roles" table="crm_sys_user_role"><!-- key标签column:当前对象在中间表中的外键的名称 --><key column="user_id"/><!-- many-to-manyclass:关联另一方的类的全路径column;关联的另一方在中间表的外键名称 --><many-to-many class="cn.itcast.domain.Role" column="role_id"/></set></class></hibernate-mapping>

在核心配置中加入映射文件<mapping resource="cn/itcast/domain/User.hbm.xml"/><mapping resource="cn/itcast/domain/Role.hbm.xml"/>

public class manytomany {@Testpublic void demo1(){Session session=HibernateUtils.getCurrentSession();Transaction tx=session.beginTransaction();User user1=new User();user1.setUser_name("wangwu");User user2=new User();user2.setUser_name("zhaosi");Role role1=new Role();role1.setRole_name("qiantaibu");Role role2=new Role();role2.setRole_name("renshibu");Role role3=new Role();role3.setRole_name("zhulibu");//如果多对多建立了双向关联,一定要有一方放弃外键维护权user1.getRoles().add(role1);user1.getRoles().add(role3);user2.getRoles().add(role2);user2.getRoles().add(role3);/*role1.getUsers().add(user1);role2.getUsers().add(user1);role2.getUsers().add(user2);role3.getUsers().add(user2);*/session.save(user1);session.save(user2);session.save(role1);session.save(role2);session.save(role3);tx.commit();}@Testpublic void demo2(){Session session=HibernateUtils.getCurrentSession();Transaction tx=session.beginTransaction();//获得赵四用户User user=session.get(User.class, 2l);//创建公关角色Role r=new Role();r.setRole_name("gongguanbu");//将角色天加到用户中user.getRoles().add(r);//将角色转为持久化session.save(r);tx.commit();}@Testpublic void demo3(){Session session=HibernateUtils.getCurrentSession();Transaction tx=session.beginTransaction();User user=session.get(User.class,2l);//获得要操作的角色对象Role r1=session.get(Role.class, 2l);//将角色从角色用户的集合中移除user.getRoles().remove(r1);tx.commit();}}

创建多对多的关系表时mysql语句:mysql> use hibernate_day01Database changedmysql> create table crm_sys_user_role(    ->  user_id bigint(50) not null,    ->  role_id bigint(50) not null    -> );Query OK, 0 rows affected (0.31 sec)mysql> alter table crm_sys_user_role add constraint ur_pk primary key(user_id,role_id);Query OK, 0 rows affected (0.77 sec)Records: 0  Duplicates: 0  Warnings: 0mysql> alter table crm_sys_user_role add constraint ur_fk1 foreign key(user_id)references crm_sys_user(user_id);Query OK, 0 rows affected (0.51 sec)Records: 0  Duplicates: 0  Warnings: 0mysql> alter table crm_sys_user_role add constraint ur_fk2 foreign key(role_id)references crm_sys_role(role_id);Query OK, 0 rows affected (0.63 sec)Records: 0  Duplicates: 0  Warnings: 0