最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Hibernate處理多對多關(guān)系的實(shí)現(xiàn)示例

 更新時(shí)間:2026年01月11日 09:20:38   作者:辭暮爾爾-煙火年年  
本文介紹了Hibernate中實(shí)現(xiàn)多對多關(guān)系的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

Hibernate中的多對多關(guān)系

在Hibernate中,多對多關(guān)系指的是一個(gè)實(shí)體可以與多個(gè)另一個(gè)實(shí)體實(shí)例相關(guān)聯(lián),反之亦然。為了實(shí)現(xiàn)這種關(guān)系,通常需要一個(gè)中間表來存儲兩者之間的關(guān)聯(lián)信息。

多對多關(guān)系的示例代碼

實(shí)體類定義

假設(shè)我們有兩個(gè)實(shí)體:StudentCourse,一個(gè)學(xué)生可以選修多門課程,一門課程也可以有多個(gè)學(xué)生。

Student類

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<Course> courses = new HashSet<>();

    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<Course> getCourses() {
        return courses;
    }

    public void setCourses(Set<Course> courses) {
        this.courses = courses;
    }
}

Course類

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<Student> students = new HashSet<>();

    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<Student> getStudents() {
        return students;
    }

    public void setStudents(Set<Student> students) {
        this.students = students;
    }
}

Hibernate配置文件hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- 數(shù)據(jù)庫連接配置 -->
        <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/your_database</property>
        <property name="hibernate.connection.username">your_username</property>
        <property name="hibernate.connection.password">your_password</property>

        <!-- Hibernate 屬性配置 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
        <property name="hibernate.hbm2ddl.auto">update</property>

        <!-- 映射類 -->
        <mapping class="com.example.domain.Student"/>
        <mapping class="com.example.domain.Course"/>
    </session-factory>
</hibernate-configuration>

HibernateUtil類

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
    private static final SessionFactory sessionFactory;

    static {
        try {
            // 從配置文件創(chuàng)建SessionFactory
            sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
        } catch (Throwable ex) {
            // 記錄啟動失敗的錯(cuò)誤
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

插入示例數(shù)據(jù)

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

        // 插入示例數(shù)據(jù)
        insertSampleData(sessionFactory);

        // 關(guān)閉SessionFactory
        sessionFactory.close();
    }

    private static void insertSampleData(SessionFactory sessionFactory) {
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        try {
            // 創(chuàng)建學(xué)生
            Student student1 = new Student("John Doe");
            Student student2 = new Student("Jane Doe");

            // 創(chuàng)建課程
            Course course1 = new Course("Mathematics");
            Course course2 = new Course("History");

            // 建立多對多關(guān)系
            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);

            // 保存數(shù)據(jù)
            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();
            }
        }
    }
}

查詢示例數(shù)據(jù)

import org.hibernate.Session;
import org.hibernate.SessionFactory;

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

        // 查詢示例數(shù)據(jù)
        querySampleData(sessionFactory);

        // 關(guān)閉SessionFactory
        sessionFactory.close();
    }

    private static void querySampleData(SessionFactory sessionFactory) {
        Session session = sessionFactory.openSession();
        try {
            // 查詢所有學(xué)生
            List<Student> 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<Course> 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();
            }
        }
    }
}

多對多關(guān)系的詳細(xì)解釋

  1. 實(shí)體類定義

    • Student 類和 Course 類通過 @ManyToMany 注解來定義多對多的關(guān)系。
    • Student 類中使用 @JoinTable 注解來定義中間表,指定了關(guān)聯(lián)的學(xué)生和課程的外鍵。
    • Course 類中使用 mappedBy 屬性來指定關(guān)系維護(hù)由 Student 類中的 courses 屬性來負(fù)責(zé)。
  2. Hibernate配置文件

    • 標(biāo)準(zhǔn)的Hibernate配置文件,用于數(shù)據(jù)庫連接和映射類的配置。
  3. HibernateUtil類

    • 一個(gè)實(shí)用類,用來創(chuàng)建和返回 SessionFactory 實(shí)例。
  4. 插入示例數(shù)據(jù)

    • 創(chuàng)建 StudentCourse 對象,并建立多對多關(guān)系。
    • 保存數(shù)據(jù)到數(shù)據(jù)庫中。
  5. 查詢示例數(shù)據(jù)

    • 查詢所有學(xué)生和他們所選修的課程,以及所有課程和選修這些課程的學(xué)生。

到此這篇關(guān)于Hibernate處理多對多關(guān)系的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Hibernate 多對多內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java?9中的"菱形"語法詳解

    Java?9中的"菱形"語法詳解

    Java?9?再次增強(qiáng)了“菱形”語法,它甚至允許在創(chuàng)建匿名內(nèi)部類時(shí)使用菱形語法,Java?可根據(jù)上下文來推斷匿名內(nèi)部類中泛型的類型,下面程序示范了在匿名內(nèi)部類中使用菱形語法,感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • springBoot項(xiàng)目常用目錄解讀

    springBoot項(xiàng)目常用目錄解讀

    這篇文章主要介紹了springBoot項(xiàng)目常用目錄解讀,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 以武俠形式理解Java LinkedList源碼

    以武俠形式理解Java LinkedList源碼

    鏈表(Linked list)是一種常見的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),是一種線性表,但是并不會按線性的順序存儲數(shù)據(jù),而是在每一個(gè)節(jié)點(diǎn)里存到下一個(gè)節(jié)點(diǎn)的地址
    2021-11-11
  • Java狀態(tài)機(jī)的一種優(yōu)雅寫法分享

    Java狀態(tài)機(jī)的一種優(yōu)雅寫法分享

    狀態(tài)機(jī)是一種數(shù)學(xué)模型,對于我們業(yè)務(wù)實(shí)現(xiàn)有很大的幫助。我們可以用非常多的方法實(shí)現(xiàn)狀態(tài)機(jī),這篇文章就來介紹一個(gè)狀態(tài)機(jī)優(yōu)雅的實(shí)現(xiàn)方法,希望對大家有所幫助
    2023-04-04
  • Java?NIO實(shí)現(xiàn)聊天功能

    Java?NIO實(shí)現(xiàn)聊天功能

    這篇文章主要為大家詳細(xì)介紹了Java?NIO實(shí)現(xiàn)聊天功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 詳解java中String值為空字符串與null的判斷方法

    詳解java中String值為空字符串與null的判斷方法

    這篇文章主要介紹了詳解java中String值為空字符串與null的判斷方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java并發(fā)編程變量可見性避免指令重排使用詳解

    Java并發(fā)編程變量可見性避免指令重排使用詳解

    這篇文章主要為大家介紹了Java并發(fā)編程變量可見性避免指令重排使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Mybatis-plus一對多分頁數(shù)據(jù)條數(shù)不正確的處理

    Mybatis-plus一對多分頁數(shù)據(jù)條數(shù)不正確的處理

    這篇文章主要介紹了Mybatis-plus一對多分頁數(shù)據(jù)條數(shù)不正確的處理,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • springboot項(xiàng)目啟動時(shí)打印maven打包時(shí)間實(shí)現(xiàn)方式

    springboot項(xiàng)目啟動時(shí)打印maven打包時(shí)間實(shí)現(xiàn)方式

    文章介紹了通過在pom文件中配置資源過濾和新增一個(gè)配置類來映射properties文件內(nèi)字段,從而在啟動時(shí)打印出打包時(shí)間的方法,以減少開發(fā)和運(yùn)維之間的溝通錯(cuò)誤
    2026-01-01
  • Spring Boot Web 靜態(tài)文件緩存處理的方法

    Spring Boot Web 靜態(tài)文件緩存處理的方法

    本篇文章主要介紹了Spring Boot Web 靜態(tài)文件緩存處理的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02

最新評論

青海省| 介休市| 德钦县| 安西县| 宁国市| 施秉县| 大方县| 钟山县| 弥渡县| 九龙县| 四川省| 西林县| 山东省| 彩票| 尼木县| 东莞市| 绍兴县| 徐州市| 绥化市| 黔西| 许昌市| 贺兰县| 资兴市| 昌平区| 黄龙县| 师宗县| 兴国县| 电白县| 玛多县| 承德市| 阳谷县| 什邡市| 石阡县| 洮南市| 望奎县| 肥西县| 河池市| 洱源县| 陇川县| 田阳县| 沈丘县|