其中 在 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(); //......
沒有留言:
張貼留言