大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 Hibernate關聯查詢的例子

Hibernate關聯查詢的例子

更新時間:2022-10-21 10:57:55 來源:動力節點 瀏覽1016次

1.說明

Hibernate框架支持通過配置映射關系實現多表關聯查詢。

2.類型

關聯查詢分為:一對一(one-to-one)、一對多(one-to-many)、多對一(many-to-one)、多對多(many-to-many)。

3.關聯查詢的應用場景

當一個POJO對象中包含了一個對象屬性或者集合屬性時,使用一般的Hibernate的查詢無法完成對象或者集合的映射,此時就需要使用Hibernate的關聯查詢。

總結:關聯查詢需要在原先配置的基礎上增加對象屬性和集合屬性的配置關系。

4.準備SQL腳本

SET SESSION FOREIGN_KEY_CHECKS=0; 
/* Drop Tables */ 
DROP TABLE IF EXISTS tb_result;
DROP TABLE IF EXISTS tb_student_identifer;
DROP TABLE IF EXISTS tb_student_teacher;
DROP TABLE IF EXISTS tb_student;
DROP TABLE IF EXISTS tb_teacher; 
/* Create Tables */ 
-- 成績表
CREATE TABLE tb_result
(
	result_id int NOT NULL AUTO_INCREMENT COMMENT '成績編號',
	result_subject varchar(50) COMMENT '科目',
	result_score float COMMENT '分數',
	student_id int NOT NULL COMMENT '學生編號',
	PRIMARY KEY (result_id)
) COMMENT = '成績表';  
-- 學生表
CREATE TABLE tb_student
(
	student_id int NOT NULL AUTO_INCREMENT COMMENT '學生編號',
	student_name varchar(50) COMMENT '學生名',
	student_pwd varchar(50) COMMENT '密碼',
	PRIMARY KEY (student_id)
) COMMENT = '學生表';  
-- 學生身份信息表
CREATE TABLE tb_student_identifer
(
	student_id int NOT NULL COMMENT '學生編號',
	student_idcard varchar(30) COMMENT '身份證號碼',
	student_number varchar(50) COMMENT '學號',
	PRIMARY KEY (student_id)
) COMMENT = '學生身份信息表';  
-- 學生教師關系表
CREATE TABLE tb_student_teacher
(
	student_id int NOT NULL COMMENT '學生編號',
	teacher_id int NOT NULL COMMENT '教師編號'
) COMMENT = '學生教師關系表';  
-- 教師表
CREATE TABLE tb_teacher
(
	teacher_id int NOT NULL AUTO_INCREMENT COMMENT '教師編號',
	teacher_name varchar(50) COMMENT '教師名字',
	teacher_pwd varchar(50) COMMENT '登錄密碼',
	PRIMARY KEY (teacher_id)
) COMMENT = '教師表';

根據數據庫表,建立對應的POJO以及映射文件。

注意:多對多的關聯表只做關聯橋梁,不生成POJO對象。

--pojo:

public class Student { 
    private Integer studentId; // 學生編號
    private String StudentName; // 姓名
    private String studentPwd; // 密碼    
    // get、set方法
} 
——————————————————————————
public class StudentIdentifer { 
    private Integer studentId;
    private String studentIdcard;
    private String studentNumber; 
    // get、set方法
} 
——————————————————————————
public class Teacher { 
    private Integer teacherId;
    private String teacherName;
    private String teacherPwd;    
    // get、set方法
} 
——————————————————————————
public class Result {
    private Integer resultId;
    private String resultSubject;
    private Float resultScore;
    private Integer studentId; 
    // get、set方法
}

xxx.hbm.xml:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping>
    <class name="org.brick.pojo.Student" table="tb_student"> 
        <!-- 配置主鍵 -->
        <id name="studentId" column="student_id">
            <generator class="identity"></generator>
        </id> 
        <!-- 配置一般屬性 -->
        <property name="studentName" column="student_name" />
        <property name="studentPwd" column="student_pwd" /> 
        <!-- 配置StudentIdentifier屬性 -->
        <one-to-one name="studentIdentifer" foreign-key="student_id"/> 
    </class>
</hibernate-mapping> 
——————————————————————————————————————————
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping>
    <class name="org.brick.pojo.StudentIdentifer" table="tb_student_identifer">
         <!-- 配置主鍵 -->
        <id name="studentId" column="student_id">
            <generator class="identity"></generator>
        </id> 
        <!-- 配置一般屬性 -->
        <property name="studentIdcard" column="student_idcard" />
        <property name="studentNumber" column="student_number" /> 
    </class>
</hibernate-mapping>
——————————————————————————————————————————
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping>
    <class name="org.brick.pojo.Teacher" table="tb_teacher"> 
        <!-- 配置主鍵 -->
        <id name="teacherId" column="teacher_id">
            <generator class="identity"></generator>
        </id> 
        <!-- 配置一般屬性 -->
        <property name="teacherName" column="teacher_name" />
        <property name="teacherPwd" column="teacher_pwd" /> 
    </class>
</hibernate-mapping>
——————————————————————————————————————————
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping>
    <class name="org.brick.pojo.Result" table="tb_result"> 
        <!-- 配置主鍵 -->
        <id name="resultId" column="result_id">
            <generator class="identity"></generator>
        </id> 
        <!-- 配置一般屬性 -->
        <property name="resultSubject" column="result_subject" />
        <property name="resultScore" column="result_score" />
        <property name="studentId" column="student_id" /> 
    </class>
</hibernate-mapping>

5.一對一關系

(1)需求

通過學生信息,查詢學生的身份信息。

這里使用ErMaster來構建ER圖。

學生表和學生身份信息表的ER圖:

(2)配置步驟說明

配置表與表的關系,步驟就兩步:

第一步:根據數據庫設計,將表與表之間的關系建立在實體類里面。

第二步:在對應的映射文件,配置映射的關系。

注意:通過入門示例修改代碼,框架配置代碼在本文忽略了,參考Hibernate【入門篇】 XXXXX。

(3)配置步驟

第一步:配置實體類的關聯關系

修改學生對象,將學生身份對象作為學生對象的一個對象屬性存在。

public class Student { 
    private Integer studentId; // 學生編號
    private String StudentName; // 姓名
    private String studentPwd; // 密碼 
    // 需求:通過studentId查詢學生身份信息
    private StudentIdentifer studentIdentifer; 
    public StudentIdentifer getStudentIdentifer() {
        return studentIdentifer;
    } 
    public void setStudentIdentifer(StudentIdentifer studentIdentifer) {
        this.studentIdentifer = studentIdentifer;
    } 
    // get、set方法
}

第二步:配置映射關系

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping>
    <class name="org.brick.pojo.Student" table="tb_student"> 
        <!-- 配置主鍵 -->
        <id name="studentId" column="student_id">
            <generator class="identity"></generator>
        </id>
         <!-- 配置一般屬性 -->
        <property name="studentName" column="student_name" />
        <property name="studentPwd" column="student_pwd" /> 
        <!-- 配置StudentIdentifier屬性 -->
        <one-to-one name="studentIdentifer" foreign-key="student_id"/>        
    </class>
</hibernate-mapping>

第三步:測試

@Test
public void findById() {
    Session session = null;
    try {
        session = HibernateUtil.getSession();
        System.out.println(session);
        // 通過Id查詢使用get方法
        Student student = session.get(Student.class, 1);
        System.out.println("編號:" + student.getStudentId() + ", 學生名:" + student.getStudentName());
        StudentIdentifer identifer = student.getStudentIdentifer();
        System.out.println("學生身份證:" + identifer.getStudentIdcard());
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        session.close();
    }
}

6.一對多的關系

(1)需求

通過學生表的記錄,查詢學生的成績記錄。

學生表和成績表的ER圖:

(2)配置步驟

第一步:配置實體類的關聯關系

一個學生對應多個考試成績,所以考試成績作為學生對象的一個集合屬性存在。

在學生實體類Student加上以下代碼。

private Set<Result> results;
public Set<Result> getResults() {
    return results;
}
public void setResults(Set<Result> results) {
    this.results = results;
}

第二步:配置映射關系

在student.hbm.xml配置文件中加入如下配置。

<!-- 配置學生和成績的"一對多關系" -->
<!-- set標簽用于配置Set集合,list標簽對應List集合 -->
<set name="results">
    <!-- 用于指定外鍵字段 -->
    <key column="student_id" />
    <!-- 用于指定一對多關系,class屬性:指定集合元素類型 -->
    <one-to-many class="org.brick.pojo.Result" />
</set>

第三步:測試

@Test
public void findById() {
    Session session = null;
    try {
        session = HibernateUtil.getSession();
        System.out.println(session);
        // 通過Id查詢使用get方法
        Student student = session.get(Student.class, 1);
        System.out.println("編號:" + student.getStudentId() + ", 學生名:" + student.getStudentName());
        Set<Result> results = student.getResults();
        for (Result result : results) {
            System.out.println("科目:" + result.getResultSubject() + ", 成績:" + result.getResultScore());
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        session.close();
    }
}

7.多對一配置

(1)需求

通過成績信息查詢學生信息。

(2)配置步驟

第一步:配置實體類的關聯關系

在成績對象(Result)中配置學生對象屬性,以表示成績表和學生表的對應關系為多對一。

在Result對象中加入以下代碼。

private Student student;
public Student getStudent() {
    return student;
}
public void setStudent(Student student) {
    this.student = student;
}

第二步:配置映射關系

修改配置文件,第一步:注釋掉原外鍵配置,第二步:配置多對一關系。

<!--
    [1] 注釋掉外鍵字段配置
  -->
<!--<property name="studentId" column="student_id" />-->
<!--
    [2] 配置成績和學生的"多對一"關系
        name屬性:配置多對一的屬性名
        column屬性:配置關聯的外鍵字段
  -->
<many-to-one name="student" column="student_id" />

第三步:測試

@Test
public void findById() {
    Session session = null;
    try {
        session = HibernateUtil.getSession();
        System.out.println(session);
        // 通過Id查詢使用get方法
        Result result = session.get(Result.class, 1);
        Student student = result.getStudent();
        System.out.println("學生Id:" + student.getStudentId() + ", 科目:" + result.getResultSubject() + ", 成績:" + result.getResultScore());
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        session.close();
    }
}

8.多對多配置

(1)需求

通過學生的記錄查詢學生的教師記錄。

學生表、老師表、學生老師表的ER圖:

(2)配置步驟

第一步:配置實體類的關聯關系

配置學生表與教師表的關系,這里在Student類中添加Teacher集合,因此在Student實體類加上以下代碼。

private Set<Teacher> teachers;
public Set<Teacher> getTeachers() {
    return teachers;
}
public void setTeachers(Set<Teacher> teachers) {
    this.teachers = teachers;
}

第二步:配置映射關系

<!-- 配置學生與教師的多對多關系 -->
<!--
    name屬性:關聯字段名
    table:多對多中間表名
  -->
<set name="teachers" table="tb_student_teacher">
    <!-- 指定本表在中間表的外鍵 -->
    <key column="student_id"/>
    <!-- 指定多對多關系 -->
    <!--
        class:返回集合的元素類型
        column:關聯表在中間表的外鍵
     -->
    <many-to-many class="org.brick.pojo.Teacher" column="teacher_id" />
</set>

第三步:測試

@Test
public void findById() {
    Session session = null;
    try {
        session = HibernateUtil.getSession();
        System.out.println(session);
        // 通過Id查詢使用get方法
        Student student = session.get(Student.class, 1);
        Set<Teacher> teachers = student.getTeachers();
        for (Teacher teacher : teachers) {
            System.out.println("學生名:" + student.getStudentName() + ", 老師名:" + teacher.getTeacherName());
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        session.close();
    }
}

 

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 精品成人免费播放国产片 | 国产在线视频色综合 | 成在线人永久免费播放视频 | 亚洲免费视频一区 | 久久久久国产午夜 | 国产精品原创 | 奇米影视亚洲狠狠色 | 久久久久久久久综合影视网 | 成人午夜网站 | 日韩一区视频在线 | aaa特级毛片 | 2020国产成人精品视频人 | 中文字幕精品视频 | 毛片在线看网站 | 夜夜久久| 久久99精品久久久久久园产越南 | 欧美在线一级毛片视频 | 亚洲 欧美 另类中文字幕 | 香蕉成人国产精品免费看网站 | 99国产成人高清在线视频 | 一级无毛 | 国产精品久久久久一区二区 | 国产精品 色 | 国产区在线观看 | 国内精品久久久久激情影院 | 欧美看片| 999毛片免费观看 | 国产在线五月综合婷婷 | 97久久精品人人澡人人爽 | youjizz欧美粗又大中国 | 精品一区二区免费视频 | 亚洲 自拍 另类 制服在线 | 91久久精品一区二区三区 | 91中文字幕在线一区 | 四虎影院网站 | 国产精品久久精品福利网站 | 亚洲精品国产免费 | 日本一片免费观看高清完整 | 一区二区三区免费视频观看 | 俄罗斯一级成人毛片 | 精品国产免费第一区二区三区日韩 |