1. 程式人生 > >Hibernate 一對多對映

Hibernate 一對多對映

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資料。