信通快递 發表於 2026-1-11 09:20:38

Hibernate处理多对多关系的实现示例

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>Hibernate中的多对多关系</li><li>多对多关系的示例代码</li><ul class="second_class_ul"><li>实体类定义</li><li>Student类</li><li>Course类</li><li>Hibernate配置文件hibernate.cfg.xml</li><li>HibernateUtil类</li><li>插入示例数据</li><li>查询示例数据</li></ul><li>多对多关系的详细解释</li><ul class="second_class_ul"></ul></ul></div><p class="maodian"></p><h2>Hibernate中的多对多关系</h2>
<p>在Hibernate中,多对多关系指的是一个实体可以与多个另一个实体实例相关联,反之亦然。为了实现这种关系,通常需要一个中间表来存储两者之间的关联信息。</p>
<p class="maodian"></p><h2>多对多关系的示例代码</h2>
<p class="maodian"></p><h3>实体类定义</h3>
<p>假设我们有两个实体:<code>Student</code> 和 <code>Course</code>,一个学生可以选修多门课程,一门课程也可以有多个学生。</p>
<p class="maodian"></p><h3>Student类</h3>
<div class="jb51code"><pre class="brush:java;">package com.example.domain;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;

@Entity
@Table(name = "student")
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    private String name;

    @ManyToMany(cascade = { CascadeType.ALL })
    @JoinTable(
      name = "student_course",
      joinColumns = { @JoinColumn(name = "student_id") },
      inverseJoinColumns = { @JoinColumn(name = "course_id") }
    )
    private Set&lt;Course&gt; courses = new HashSet&lt;&gt;();

    public Student() {}

    public Student(String name) {
      this.name = name;
    }

    // Getters 和 Setters

    public Long getId() {
      return id;
    }

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

    public String getName() {
      return name;
    }

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

    public Set&lt;Course&gt; getCourses() {
      return courses;
    }

    public void setCourses(Set&lt;Course&gt; courses) {
      this.courses = courses;
    }
}
</pre></div>
<p class="maodian"></p><h3>Course类</h3>
<div class="jb51code"><pre class="brush:java;">package com.example.domain;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;

@Entity
@Table(name = "course")
public class Course {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    private String name;

    @ManyToMany(mappedBy = "courses")
    private Set&lt;Student&gt; students = new HashSet&lt;&gt;();

    public Course() {}

    public Course(String name) {
      this.name = name;
    }

    // Getters 和 Setters

    public Long getId() {
      return id;
    }

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

    public String getName() {
      return name;
    }

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

    public Set&lt;Student&gt; getStudents() {
      return students;
    }

    public void setStudents(Set&lt;Student&gt; students) {
      this.students = students;
    }
}
</pre></div>
<p class="maodian"></p><h3>Hibernate配置文件hibernate.cfg.xml</h3>
<div class="jb51code"><pre class="brush:xml;">&lt;!DOCTYPE hibernate-configuration PUBLIC
      "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
      "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"&gt;
&lt;hibernate-configuration&gt;
    &lt;session-factory&gt;
      &lt;!-- 数据库连接配置 --&gt;
      &lt;property name="hibernate.connection.driver_class"&gt;com.mysql.cj.jdbc.Driver&lt;/property&gt;
      &lt;property name="hibernate.connection.url"&gt;jdbc:mysql://localhost:3306/your_database&lt;/property&gt;
      &lt;property name="hibernate.connection.username"&gt;your_username&lt;/property&gt;
      &lt;property name="hibernate.connection.password"&gt;your_password&lt;/property&gt;

      &lt;!-- Hibernate 属性配置 --&gt;
      &lt;property name="hibernate.dialect"&gt;org.hibernate.dialect.MySQLDialect&lt;/property&gt;
      &lt;property name="hibernate.show_sql"&gt;true&lt;/property&gt;
      &lt;property name="hibernate.format_sql"&gt;true&lt;/property&gt;
      &lt;property name="hibernate.hbm2ddl.auto"&gt;update&lt;/property&gt;

      &lt;!-- 映射类 --&gt;
      &lt;mapping class="com.example.domain.Student"/&gt;
      &lt;mapping class="com.example.domain.Course"/&gt;
    &lt;/session-factory&gt;
&lt;/hibernate-configuration&gt;
</pre></div>
<p class="maodian"></p><h3>HibernateUtil类</h3>
<div class="jb51code"><pre class="brush:java;">import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
    private static final SessionFactory sessionFactory;

    static {
      try {
            // 从配置文件创建SessionFactory
            sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
      } catch (Throwable ex) {
            // 记录启动失败的错误
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
      }
    }

    public static SessionFactory getSessionFactory() {
      return sessionFactory;
    }
}
</pre></div>
<p class="maodian"></p><h3>插入示例数据</h3>
<div class="jb51code"><pre class="brush:java;">import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

public class HibernateInsertData {
    public static void main(String[] args) {
      // 获取SessionFactory
      SessionFactory sessionFactory = HibernateUtil.getSessionFactory();

      // 插入示例数据
      insertSampleData(sessionFactory);

      // 关闭SessionFactory
      sessionFactory.close();
    }

    private static void insertSampleData(SessionFactory sessionFactory) {
      Session session = sessionFactory.openSession();
      Transaction transaction = session.beginTransaction();
      try {
            // 创建学生
            Student student1 = new Student("John Doe");
            Student student2 = new Student("Jane Doe");

            // 创建课程
            Course course1 = new Course("Mathematics");
            Course course2 = new Course("History");

            // 建立多对多关系
            student1.getCourses().add(course1);
            student1.getCourses().add(course2);

            student2.getCourses().add(course1);
            student2.getCourses().add(course2);

            course1.getStudents().add(student1);
            course1.getStudents().add(student2);

            course2.getStudents().add(student1);
            course2.getStudents().add(student2);

            // 保存数据
            session.save(student1);
            session.save(student2);

            transaction.commit();
            System.out.println("Inserted sample data");
      } catch (Exception e) {
            if (transaction != null) {
                transaction.rollback();
            }
            e.printStackTrace();
      } finally {
            if (session != null) {
                session.close();
            }
      }
    }
}
</pre></div>
<p class="maodian"></p><h3>查询示例数据</h3>
<div class="jb51code"><pre class="brush:java;">import org.hibernate.Session;
import org.hibernate.SessionFactory;

public class HibernateQueryExample {
    public static void main(String[] args) {
      // 获取SessionFactory
      SessionFactory sessionFactory = HibernateUtil.getSessionFactory();

      // 查询示例数据
      querySampleData(sessionFactory);

      // 关闭SessionFactory
      sessionFactory.close();
    }

    private static void querySampleData(SessionFactory sessionFactory) {
      Session session = sessionFactory.openSession();
      try {
            // 查询所有学生
            List&lt;Student&gt; students = session.createQuery("from Student", Student.class).list();
            for (Student student : students) {
                System.out.println("Student Name: " + student.getName());
                for (Course course : student.getCourses()) {
                  System.out.println("Enrolled in: " + course.getName());
                }
            }

            // 查询所有课程
            List&lt;Course&gt; courses = session.createQuery("from Course", Course.class).list();
            for (Course course : courses) {
                System.out.println("Course Name: " + course.getName());
                for (Student student : course.getStudents()) {
                  System.out.println("Student: " + student.getName());
                }
            }
      } catch (Exception e) {
            e.printStackTrace();
      } finally {
            if (session != null) {
                session.close();
            }
      }
    }
}
</pre></div>
<p class="maodian"></p><h2>多对多关系的详细解释</h2>
<ol><li><p><strong>实体类定义</strong>:</p>
<ul><li><code>Student</code> 类和 <code>Course</code> 类通过 <code>@ManyToMany</code> 注解来定义多对多的关系。</li><li><code>Student</code> 类中使用 <code>@JoinTable</code> 注解来定义中间表,指定了关联的学生和课程的外键。</li><li><code>Course</code> 类中使用 <code>mappedBy</code> 属性来指定关系维护由 <code>Student</code> 类中的 <code>courses</code> 属性来负责。</li></ul></li><li><p><strong>Hibernate配置文件</strong>:</p>
<ul><li>标准的Hibernate配置文件,用于数据库连接和映射类的配置。</li></ul></li><li><p><strong>HibernateUtil类</strong>:</p>
<ul><li>一个实用类,用来创建和返回 <code>SessionFactory</code> 实例。</li></ul></li><li><p><strong>插入示例数据</strong>:</p>
<ul><li>创建 <code>Student</code> 和 <code>Course</code> 对象,并建立多对多关系。</li><li>保存数据到数据库中。</li></ul></li><li><p><strong>查询示例数据</strong>:</p>
<ul><li>查询所有学生和他们所选修的课程,以及所有课程和选修这些课程的学生。</li></ul></li></ol>
<p>到此这篇关于Hibernate处理多对多关系的实现示例的文章就介绍到这了,更多相关Hibernate 多对多内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>Java Hibernate中一对多和多对多关系的映射方式</li><li>Hibernate双向多对多映射关系配置代码实例</li><li>JSP 开发之hibernate的hql查询多对多查询</li><li>详解hibernate双向多对多关联映射XML与注解版</li><li>java Hibernate多对多映射详解及实例代码</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: Hibernate处理多对多关系的实现示例