`
namezhou
  • 浏览: 158631 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Hibernate 多对多 关系的实现

阅读更多

需要两个实体类,student和course ,多对多的关系,

 
采用三个表来实现,分别是m2mstudent 学生表,course 课程表,stdcourse学生课程表
 
实体类(全部省去无参构造和getter\setter)
 

public class Student {
 private int sid;
 private int scode;
 private String sname;
 private Set<Course> courses;
}
 
public class Course {
 private int cid;
 private String cname;
 private Set<Student> students;
}

 
 
Hibernate映射文件
 
student.hbm.xml
 

<hibernate-mapping package="day4.m2m.entity">
 <class name="Student" table="m2mstudent" >
  <id name="sid" column="sid">
   <generator class="sequence">
    <param name="sequence">student_seq</param>
   </generator>
  </id>
  <property name="scode"></property>
  <property name="sname"></property>
  <set name="courses" inverse="true" table="stdcourse" cascade="all">
   <!--指定关联的外键列-->
   <key column="sid"></key>
   <!--用以映射关联类属性-->
   <many-to-many class="Course" column="cid"></many-to-many>
  </set>
 </class>
</hibernate-mapping>

  
course.hbm.xml
 

<hibernate-mapping package="day4.m2m.entity">
 <class name="Course" table="course">
  <id name="cid" column="cid">
   <generator class="native"></generator>
  </id>
  <property name="cname"></property>
  <set name="students" inverse="false" table="stdcourse" cascade="all">
   <!--指定关联的外键列-->
   <key column="cid"></key>
   <!--用以映射关联类属性-->
   <many-to-many class="Student" column="sid"></many-to-many>
  </set>
 </class>
</hibernate-mapping>

  
测试代码: 别笑 :-)

public class TestM2M {
 
 public static void main(String[] args) { 
  //表控制权位于Course中
  Course c1 = new Course();
  Course c2 = new Course();
  Course c3 = new Course();
  Course c4 = new Course();
  
  
  c1.setCname("语文");
  c2.setCname("数学");
  c3.setCname("化学");
  c4.setCname("生物");
  
  
  
  Student s1 = new Student(100,"周哥哥");
  Student s2 = new Student(101,"周姑姑");
  Student s3 = new Student(102,"周弟弟");
  Student s4 = new Student(103,"周妹妹");
  Student s5 = new Student(104,"周姐姐");
  Student s6 = new Student(105,"周爸爸");
  Student s7 = new Student(106,"周妈妈");
  Student s8 = new Student(107,"周爷爷");
  Student s9 = new Student(108,"周奶奶");
  Student s10 = new Student(109,"周舅舅");
  Student s11 = new Student(110,"周婶婶");
  Student s12 = new Student(111,"周姥姥");
  
  Set<Student> stu_yuwen = new HashSet<Student>();
  stu_yuwen.add(s1);
  stu_yuwen.add(s2);
  stu_yuwen.add(s3);
  stu_yuwen.add(s5);
  
  Set<Student> stu_shuxue = new HashSet<Student>();
  stu_shuxue.add(s2);
  stu_shuxue.add(s4);
  stu_shuxue.add(s7);
  stu_shuxue.add(s9);
  stu_shuxue.add(s11);
  
  Set<Student> stu_huaxue = new HashSet<Student>();
  stu_huaxue.add(s1);
  stu_huaxue.add(s3);
  stu_huaxue.add(s7);
  stu_huaxue.add(s9);
  
  Set<Student> stu_shengwu = new HashSet<Student>();
  stu_shengwu.add(s6);
  stu_shengwu.add(s8);
  stu_shengwu.add(s10);
  stu_shengwu.add(s1);
  stu_shengwu.add(s2);
  stu_shengwu.add(s3);
  
  c1.setStudents(stu_yuwen);
  c2.setStudents(stu_shuxue);
  c3.setStudents(stu_huaxue);
  c4.setStudents(stu_shengwu);
  
  Session ss = DBFactory.getSession();
  Transaction ts = ss.beginTransaction();
  ss.save(c1);
  ss.save(c2);
  ss.save(c3);
  ss.save(c4);
  ts.commit();
  ss.close();
 }
 
}

 或许保存Student到数据库更符合人们的习惯
 
只需要将xml文件中的inverse对调,然后更改到如下测试代码
 

public static void main(String[] args) { 
  //表控制权位于Student中
  Course c1 = new Course();
  Course c2 = new Course();
  Course c3 = new Course();
  Course c4 = new Course();
  Course c5 = new Course();
  Course c6 = new Course();
  Course c7 = new Course();
  Course c8 = new Course();
  
  
  
  c1.setCname("语文");
  c2.setCname("数学");
  c3.setCname("化学");
  c4.setCname("生物");
  c5.setCname("计算机");
  c6.setCname("政治");
  c7.setCname("历史");
  c8.setCname("物理");
  
  
  
  Student s1 = new Student(100,"周哥哥");
  Student s2 = new Student(102,"周弟弟");
  Student s3 = new Student(103,"周妹妹");
  Student s4 = new Student(104,"周姐姐");
 
  
  Set<Course> set1 = new HashSet<Course>();
  set1.add(c1);
  set1.add(c3);
  set1.add(c5);
  set1.add(c4);
  set1.add(c2);
  s1.setCourses(set1);
  Set<Course> set2 = new HashSet<Course>();
  set2.add(c1);
  set2.add(c2);
  set2.add(c3);
  s2.setCourses(set2);
  Set<Course> set3 = new HashSet<Course>();
  set3.add(c3);
  set3.add(c4);
  set3.add(c5);
  set3.add(c6);
  set3.add(c7);
  s3.setCourses(set3);
  Set<Course> set4 = new HashSet<Course>();
  set4.add(c1);
  set4.add(c4);
  set4.add(c5);
  set4.add(c8);
  s4.setCourses(set4);
  
  
  Session ss = DBFactory.getSession();
  Transaction ts = ss.beginTransaction();
  ss.save(s1);
  ss.save(s2);
  ss.save(s3);
  ss.save(s4);
  ts.commit();
  ss.close();
 }

 

分享到:
评论

相关推荐

    hibernate多对一单向关联关系实现源码

    以上就是关于Hibernate中实现多对一单向关联关系的基本知识,包括如何在实体类中定义关联、如何进行数据库操作以及如何查询关联对象。这个源代码示例应该提供了更具体的实现细节,你可以通过查看和运行它来深入理解...

    hibernate多对多关联映射

    本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关配置和操作。 一、多对多关联概述 在数据库设计中,多对多关联表示两个表之间的关系,如学生和课程的关系,一个学生可以选修多门课程,而...

    hibernate实现多对多关联关系源码

    以下是实现多对多关联关系的关键步骤: 1. **定义实体类**:首先,为涉及多对多关联的两个实体创建对应的Java类。例如,假设我们有`User`和`Role`两个实体,它们之间的关系是多对多。 ```java @Entity public ...

    hibernate(多对多关系映射)

    通过理解以上知识点,你可以有效地使用Hibernate实现多对多关系映射,并在实际项目中进行高效的数据操作。提供的压缩包文件可能包含了示例代码、SQL脚本以及详细的解释,这对于学习和实践这一主题非常有价值。

    Hibernate一对一,一对多,多对多实例

    本实例将深入探讨Hibernate中的三种基本关联关系:一对一(One-to-One)、一对多(One-to-Many)以及多对多(Many-to-Many)的实现方式。 1. **一对一关联**: 一对一关联通常出现在两个实体之间存在唯一对应关系...

    hibernate多对多的简单实现

    在Java的持久化框架Hibernate中...总的来说,这个项目提供了如何在SSH框架下实现多对多关系的实例,涵盖了从数据库设计到业务逻辑处理的全过程。通过学习和实践,开发者可以更好地理解和掌握Hibernate中的多对多关联。

    Hibernate多对多关联关系demo

    在Hibernate中,多对多关联关系通过`&lt;many-to-many&gt;`标签来实现。你需要在两个实体的映射文件中分别定义对方的引用。例如,假设我们有两个实体,一个是“学生”(Student),另一个是“课程”(Course)。在Student...

    hibernate 映射关系学习入门 多对多实体映射

    本教程将带你入门Hibernate的多对多实体映射,帮助你理解如何通过源码来实现这种复杂的关系映射。 一、Hibernate概述 Hibernate是一个对象关系映射(ORM)框架,它允许我们将Java对象(实体)与数据库表进行映射,...

    hibernate多对多查询

    进行多对多查询时,我们可以通过Hibernate的Criteria API、HQL(Hibernate Query Language)或JPA的Query API来实现。例如,如果我们想找到所有选修了特定课程的学生,可以使用HQL: ```java String hql = "FROM ...

    hibernate 多对多源代码

    在Java的持久化框架Hibernate中,多对多(Many-to-Many)关系是数据库中常见的关联类型,它允许一个实体实例对应多个其他实体实例,反之亦然。本篇将深入探讨Hibernate如何处理这种复杂的数据关联。 一、多对多关系...

    hibernate多对多关系项目

    在Hibernate中,实现多对多映射主要涉及以下两个方面: 1. **配置映射文件(XML)**:在Hibernate的映射文件中,使用`&lt;many-to-many&gt;`标签定义多对多关系。需要指定关联表的`class`属性(对应Java类),`table`属性...

    Hibernate多对多实例+数据库代码

    通过查看代码和运行示例,开发者可以深入理解Hibernate是如何自动处理复杂的关联操作,比如通过中间表实现多对多的添加、删除和查找。 **总结** 这个"Hibernate多对多实例+数据库代码"涵盖了ORM的核心概念,特别是...

    hibernate一对多项目

    本项目“hibernate一对多项目”旨在演示如何在JavaWeb应用中使用Hibernate处理一对多的关系映射。这里我们将深入探讨 Hibernate 的一对多关系、配置以及在实际项目中的应用。 首先,一对多关系在数据库中很常见,...

    hibernate实现数据库表的多种关系

    本示例着重于如何利用Hibernate来实现不同类型的数据库表之间的关联,包括一对一、一对多、多对一以及多对多的关系。 **一对一关系:** 一对一关联通常发生在两个表之间有唯一对应关系时,比如一个用户只有一个账号...

    Hibernate的多对一和一对多操作实例

    在数据库层面,实现多对一和一对多关系通常涉及创建表之间的外键约束。但在本例中,作者提到了一种较为简化的设计方式,即不在数据库层面上明确设定外键,而是将逻辑关系的控制交给了Hibernate框架。这种方式虽然...

    hibernate一对多与多对一

    本篇文章将详细讲解"hibernate一对多与多对一"的关系映射概念,以及如何在实际开发中进行配置和使用。 首先,我们来看一下“一对多”关系。在现实世界中,这种关系可以对应到例如一个班级有多个学生,或者一个人...

    Hibernate多对多关联添加及查询示例

    本示例主要关注的是Hibernate中的多对多关联映射及其添加与查询方法。 多对多关联是数据库设计中的一种常见关系类型,指的是两个实体之间可以存在多个对应关系。例如,在学生与课程的关系中,一个学生可以选修多门...

    hibernate多对多关联映射(单项关联)

    总的来说,这篇博客和相关代码示例为开发者提供了一个理解和实现Hibernate中多对多单向关联的起点,帮助他们更好地处理复杂的数据库关系映射。学习和实践这部分内容对于提升Java后端开发能力,特别是使用Hibernate...

    hibernate多对多

    总结来说,"Hibernate多对多"涉及到Java ORM框架Hibernate处理两个实体类之间的多对多关系的技术,在MyEclipse环境下进行开发,提供了从设计实体类、配置映射到实现业务逻辑的全套解决方案。通过提供的压缩包文件,...

Global site tag (gtag.js) - Google Analytics