更新時間:2022-10-21 10:57:55 來源:動力節點 瀏覽1016次
Hibernate框架支持通過配置映射關系實現多表關聯查詢。
關聯查詢分為:一對一(one-to-one)、一對多(one-to-many)、多對一(many-to-one)、多對多(many-to-many)。
當一個POJO對象中包含了一個對象屬性或者集合屬性時,使用一般的Hibernate的查詢無法完成對象或者集合的映射,此時就需要使用Hibernate的關聯查詢。
總結:關聯查詢需要在原先配置的基礎上增加對象屬性和集合屬性的配置關系。
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>
(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();
}
}
(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();
}
}
(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();
}
}
(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();
}
}
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習