其中 在 Hibernate 對於物件的觀點,有分為 Entity type 和 Value Type
這部份我之後再詳細介紹,先來說說物件關係映射 (O-R Mapping)
在這篇要介紹的是 一對多 的關係映射
在日常生活的例子中,一對多就毫比如在宿舍裡,一間寢室有好幾個學生、或是一個使用者會有好幾個信箱。以宿舍的例子為例,我們必須記錄學生和寢室的資料
那資料表的內容及如下:
我們可以實作兩個類別(Student、Room) 以及之間的關係,程式如下:
package MapPOJO;
public class Student implements java.io.Serializable
{
private Long id;
private String name;
public Student(){}
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;
}
}
package MapPOJO;
import java.util.Set;
public class Room implements java.io.Serializable
{
private Long id;
private String address;
//一對多關係, 一間寢室(Room) "引用(reference)" 多位學生(Student)
private Set students;
public Room(){}
public Long getId(){
return id;
}
public void setId(Long id){
this.id = id;
}
public String getAddress(){
return address;
}
public void setAddress(String address){
this.address = address;
}
public Set getStudents(){
return students;
}
public void setStudents(Set students){
this.students = students;
}
public void addStudents(Student student){
students.add(student);
}
public void removeStudents(Student student){
students.remove(student);
}
}
以上是 Room 和 Student 的類別對照上面的資料表,即是一個類別對應一個資料表
接下來再來看看這兩個類別的映射文件
Student.hbm.xml
Room.hbm.xml
在上面的 Room.hbm.xml 中,由於對於 Room 來說
一對多的關聯即是在 Room 實例的 students 屬性上
就是一個 Room 會有多個 Student
所以在 Room 的映射文件中
以 set 標籤的 name 屬性指明了 Room 實例的 students
別忘了要在配置文件 hibernate.cfg.xml 中加入以下
<mapping resource="MapPOJO/Student.hbm.xml"/>
<mapping resource="MapPOJO/Room.hbm.xml"/>
最後我們再來以一個 JSP 來新增資料到資料表裡,程式如下:
//......
Student student1 = new Student();
Student student2 = new Student();
Student student3 = new Student();
student1.setName("David");
student2.setName("France");
student3.setName("Elva");
Room room1 = new Room();
Room room2 = new Room();
room1.setAddress("ISO-505");
room1.setStudents(new HashSet());
room2.setAddress("ISO-504");
room2.setStudents(new HashSet());
room1.addStudents(student1);
room1.addStudents(student2);
room2.addStudents(student3);
org.hibernate.SessionFactory sessionfactory = HibernateUtil.getSessionFactory();
org.hibernate.Session session1 = sessionfactory.openSession();
org.hibernate.Transaction tx = session1.beginTransaction();
session1.save(room1);
session1.save(room2);
tx.commit();
session1.close();
//......

沒有留言:
張貼留言