Hibernate 一對多對映
阿新 • • 發佈:2018-11-24
Hibernate 一對多對映(單向查詢/雙向查詢)
>> 查詢一個學校(School)中的所有學生(Student)姓名資訊。
實現過程
1. Stduent.java
加入School物件,用於表明本學生的學校資訊。
package com.java1234.hibernate.model; public class Student { private int id; private String name; private School school; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public School getSchool() { return school; } public void setSchool(School school) { this.school = school; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + "]"; } }
2. School.java
加入Set<Student>用於對映本校學生資訊。
package com.java1234.hibernate.model; import java.util.Set; public class School { private int id; private String name; private Set<Student> students; public int getId() { return id; } public void setId(int 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; } }
3. student.hbm.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.java1234.hibernate.model.Student" table="tb_student"> <id name="id" column="stuId"> <generator class="native"/> </id> <property name="name" column="stuName"/> <!-- 宣告tb_Stduent表中的外來鍵,通過本屬性完成Student-School的連線 --> <many-to-one name="school" cascade="save-update" column="schoolId" class="com.java1234.hibernate.model.School" /> </class> </hibernate-mapping>
4. school.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.java1234.hibernate.model.School" table="tb_school">
<id name="id" column="schoolId">
<generator class="native"/>
</id>
<property name="name" column="schoolName"/>
<set name="students" cascade="save-update">
<!-- 對應student.hbm.xml中的外來鍵 ,通過本屬性完成School-Student的連線-->
<key column="schoolId"/>
<one-to-many class="com.java1234.hibernate.model.Student"/>
</set>
</class>
</hibernate-mapping>
5. 生成表結構
SQL: 生成兩個表,然後在student表中指定外來鍵,以連線school表。
Hibernate: create table tb_school (schoolId integer not null auto_increment, schoolName varchar(255), primary key (schoolId))
Hibernate: create table tb_student (stuId integer not null auto_increment, stuName varchar(255), schoolId integer, primary key (stuId))
Hibernate: alter table tb_student add constraint FK_9r9feouw7ag48dhdi4eyoykxv foreign key (schoolId) references tb_school (schoolId)
圖示:
6. 插入資料。
@Test
public void testInsert(){
session.beginTransaction();
School school1 = new School();
school1.setName("No.23 Middle School");
School school2 = new School();
school2.setName("No.98 Middle School");
Student student1 = new Student();
student1.setName("Robin");
student1.setSchool(school1);
Student student2 = new Student();
student2.setName("Mary");
student2.setSchool(school1);
Student student3 = new Student();
student3.setName("Gery");
student3.setSchool(school2);
session.save(student1);
session.save(student2);
session.save(school2);
session.getTransaction().commit();
}
在此過程中產生的SQL:
由於在student.hbm.xml中添加了cacsde='save-update'屬性,所以在儲存student物件時,會把相應的school資訊一同儲存進資料庫; 而在school.hbm..xml中未新增cascade屬性,由於其預設值為null, 所以在執行儲存school物件時不對新增對應的student。
Hibernate: insert into tb_school (schoolName) values (?)
Hibernate: insert into tb_student (stuName, schoolId) values (?, ?)
Hibernate: insert into tb_student (stuName, schoolId) values (?, ?)
Hibernate: insert into tb_school (schoolName) values (?)
7. 刪除資料
如果使用 cascade='delete' 級聯刪除,在刪除student資料時 會自動刪除對應的school資料。