2010年8月21日 星期六

Hibernate 教學 - 一對多 (Entity Type)

接下來會介紹很多關於 O-R Mapping,譬如一對多、多對一、一對一等

其中 在 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();
//......

沒有留言:

張貼留言