我的日常

登录/注册
您现在的位置:论坛 资料库 JAVA开发 > hibernate(多对多)映射关系
总共48086条微博

动态微博

查看: 1426|回复: 2

hibernate(多对多)映射关系

[复制链接]

279

主题

41

听众

689

金钱

版主

该用户从未签到

跳转到指定楼层
楼主
发表于 2015-04-14 20:53:27 |只看该作者 |倒序浏览
hibernate(多对多)映射关系两张表的多对多关系,在数据库中通常是通过第三张中间表来实现的,第三张中间表放的是两张表各自的主键值,通过主键与主键的对应来体现表直接的关系。比如在权限系统中,一个用户可以拥有多种权限,而一种权限也可以授予多个用户。
  1. package cn.itcast.g_hbm_manyToMany;

  2. import java.util.HashSet;
  3. import java.util.Set;

  4. public class Student {
  5.     private Long id;
  6.     private String name;

  7.     private Set<Teacher> teachers = new HashSet<Teacher>();

  8.     public Long getId() {
  9.         return id;
  10.     }

  11.     public void setId(Long id) {
  12.         this.id = id;
  13.     }

  14.     public String getName() {
  15.         return name;
  16.     }

  17.     public void setName(String name) {
  18.         this.name = name;
  19.     }

  20.     public Set<Teacher> getTeachers() {
  21.         return teachers;
  22.     }

  23.     public void setTeachers(Set<Teacher> teachers) {
  24.         this.teachers = teachers;
  25.     }
  26.     @Override
  27.     public String toString() {
  28.         return "[Student: id=" + id + ", name=" + name + "]";
  29.     }
  30. }
复制代码
  1. package cn.itcast.g_hbm_manyToMany;

  2. import java.util.HashSet;
  3. import java.util.Set;


  4. public class Teacher {
  5.     private Long id;
  6.     private String name;

  7.     private Set<Student> students = new HashSet<Student>();
  8.    
  9.     public Long getId() {
  10.         return id;
  11.     }

  12.     public void setId(Long id) {
  13.         this.id = id;
  14.     }

  15.     public String getName() {
  16.         return name;
  17.     }

  18.     public void setName(String name) {
  19.         this.name = name;
  20.     }

  21.     public Set<Student> getStudents() {
  22.         return students;
  23.     }

  24.     public void setStudents(Set<Student> students) {
  25.         this.students = students;
  26.     }
  27.     @Override
  28.     public String toString() {
  29.         return "[Teacher: id=" + id + ", name=" + name + "]";
  30.     }
  31. }
复制代码
  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3.         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4.         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

  5. <hibernate-mapping package="cn.itcast.g_hbm_manyToMany">
  6.    
  7.     <class name="Student" table="student">
  8.         <id name="id">
  9.             <generator class="native"></generator>
  10.         </id>
  11.         <property name="name"/>
  12.         
  13.         <!-- teachers属性,Set集合。
  14.             表达的是本类与Teacher的多对多。
  15.             
  16.             table属性:中间表(集合表)
  17.             key子元素:集合外键(引用当前表主键的那个外键)
  18.          -->
  19.         <set name="teachers" table="teacher_student" inverse="false">
  20.             <key column="studentId"></key>
  21.             <many-to-many class="Teacher" column="teacherId"></many-to-many>
  22.         </set>
  23.             
  24.     </class>
  25.    
  26. </hibernate-mapping>
复制代码
  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3.         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4.         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

  5. <hibernate-mapping package="cn.itcast.g_hbm_manyToMany">
  6.    
  7.     <class name="Teacher" table="teacher">
  8.         <id name="id">
  9.             <generator class="native"></generator>
  10.         </id>
  11.         <property name="name" type="string" column="name"/>
  12.         
  13.         <!-- students属性,Set集合。
  14.             表达的是本类与Student的多对多。
  15.          -->
  16.         <set name="students" table="teacher_student" inverse="true">
  17.             <key column="teacherId"></key>
  18.             <many-to-many class="Student" column="studentId"></many-to-many>
  19.         </set>
  20.         
  21.     </class>
  22.    
  23. </hibernate-mapping>
复制代码
  1. package cn.itcast.g_hbm_manyToMany;

  2. import org.hibernate.Session;
  3. import org.hibernate.SessionFactory;
  4. import org.hibernate.cfg.Configuration;
  5. import org.junit.Test;

  6. import com.java1234.util.HibernateSessionFactory;

  7. public class App {

  8.     private static SessionFactory sessionFactory =HibernateSessionFactory.getSessionFactory();

  9.     // 保存,有关联关系
  10.     @Test
  11.     public void testSave() throws Exception {
  12.         Session session = sessionFactory.openSession();
  13.         session.beginTransaction();
  14.         // --------------------------------------------

  15.         // 新建对象
  16.         Student student1 = new Student();
  17.         student1.setName("王同学1");

  18.         Student student2 = new Student();
  19.         student2.setName("李同学2");

  20.         Teacher teacher1 = new Teacher();
  21.         teacher1.setName("赵老师3");

  22.         Teacher teacher2 = new Teacher();
  23.         teacher2.setName("蔡老师4");

  24.         // 关联起来
  25.         student1.getTeachers().add(teacher1);
  26.         student1.getTeachers().add(teacher2);
  27.         student2.getTeachers().add(teacher1);
  28.         student2.getTeachers().add(teacher2);

  29.         teacher1.getStudents().add(student1);
  30.         teacher1.getStudents().add(student2);
  31.         teacher2.getStudents().add(student1);
  32.         teacher2.getStudents().add(student2);

  33.         // 保存
  34.         session.save(student1);
  35.         session.save(student2);
  36.         session.save(teacher1);
  37.         session.save(teacher2);

  38.         // --------------------------------------------
  39.         session.getTransaction().commit();
  40.         session.close();
  41.     }

  42.     // 获取,可以获取到关联的对方
  43.     @Test
  44.     public void testGet() throws Exception {
  45.         Session session = sessionFactory.openSession();
  46.         session.beginTransaction();
  47.         // --------------------------------------------

  48.         // 获取一方,并显示另一方信息
  49.         Teacher teacher = (Teacher) session.get(Teacher.class, 3L);
  50.         System.out.println(teacher);
  51.         System.out.println(teacher.getStudents());

  52.         // --------------------------------------------
  53.         session.getTransaction().commit();
  54.         session.close();

  55.     }

  56.     // 解除关联关系
  57.     @Test
  58.     public void testRemoveRelation() throws Exception {
  59.         Session session = sessionFactory.openSession();
  60.         session.beginTransaction();
  61.         // --------------------------------------------

  62.         // 如果inverse=false就可以解除,如果为true就不可以解除
  63.         Teacher teacher = (Teacher) session.get(Teacher.class, 3L);
  64.         teacher.getStudents().clear();

  65.         // --------------------------------------------
  66.         session.getTransaction().commit();
  67.         session.close();
  68.     }

  69.     // 删除对象,对关联对象的影响
  70.     @Test
  71.     public void testDelete() throws Exception {
  72.         Session session = sessionFactory.openSession();
  73.         session.beginTransaction();
  74.         // --------------------------------------------

  75.         // a, 如果没有关联的对方:能删除。
  76.         // b, 如果有关联的对方且inverse=false,由于可以维护关联关系,他就会先删除关联关系,再删除自己。
  77.         // c, 如果有关联的对方且inverse=true,由于不能维护关联关系,所以会直接执行删除自己,就会有异常。
  78.         Teacher teacher = (Teacher) session.get(Teacher.class, 9L);
  79.         session.delete(teacher);

  80.         // --------------------------------------------
  81.         session.getTransaction().commit();
  82.         session.close();
  83.     }

  84. }
复制代码





科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、科帮网管理员和版主有权不事先通知发贴者而删除本文


JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

3

主题

1

听众

122

金钱

四袋长老

该用户从未签到

沙发
发表于 2015-05-14 00:31:26 |只看该作者
终于可以回复了
回复

使用道具 举报

快速回复
您需要登录后才可以回帖 登录 | 立即注册

   

关闭

站长推荐上一条 /1 下一条

发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
快速回复 返回顶部 返回列表