2010年10月27日 星期三

Hibernate 教學 - 值型別的 Component (二)

上一篇所說到的 Component 中,我們是以一個一對多的例子來說明

最重要的觀念就是針對 Value Type 實作出一個類別,以及在組態檔中的設定,先來看看之前組態檔的寫法

用上一篇的 Employee 組態檔來說明

<set name="photos" table="photoOne">
    <key column="employee_fk" />
    <composite-element class="MapPOJO.PhotoOne">
        <property name="photoFileName" column="photo_file_name"
                                       not-null="true" />
        <property name="width" column="width" not-null="true" />
        <property name="height" column="height" not-null="true" />
    </composite-element>
</set>

以上是一對多中 再一的這一方(Empolyee) 在指定 Employee 的 photos 屬性時的寫法

用 <composite-element> 帶出實做值型別的類別並以 <property> 子標籤指定該類別所需之屬性

如果 Value Type(值型別)的資料是一對一時,針對 Value Type 的部分我們不實做類別


這樣的寫法就非常非常普通,該值型別就只是一個欄位霸了,如果今天因為需求,必須實做一個類別呢??

我以一個 Person(人) 會有一個專屬的聯絡方式來說明,此聯絡方式是一個須實做的類別

包含了手機號碼、家用號碼、住址、信箱。

Contact.java
package MapPOJO;
public class Contact implements java.io.Serializable
{
     private String cellphone;  //手機號碼
     private String telphone;  //家用號碼
     private String address;  //住址
     private String email;  //信箱
     
     public Contact(){}
     
     public String getCellphone(){
        return cellphone;
     }
     public void setCellphone(String cellphone){
        this.cellphone = cellphone;
     }
     public String gettelphone(){
        return telphone;
     }
     public void setTelphone(String telphone){
        this.telphone = telphone;
     }
     public String getAddress(){
        return address;
     }
     public void setAddress(String address){
        this.address = address;
     }
     public String getEmail(){
        return email;
     }
     public void setEmail(String email){
        this.email = email;
     }
}

看一下 Person.java
package MapPOJO;
public class Person implements java.io.Serializable
{
    private Long id;
    private String name;
    private Contact contact;  //ㄧ對一 !!
    public Person(){}

    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;
    }
    public Contact getContact(){
        return contact;
    }
    public void setContact(Contact contact){
        this.contact = contact;
    }
}

以上是唯一對一的情況,或許會問說為什麼 Contact 沒有一個屬性對應到 Person ?

別忘了 Contact 只是一個 Value Type,且依賴於 Person 下

最後就看一下 Person 的組態檔跟之前所介紹的 Component 有啥差別

Person.hbm.xml

  
      
          
      

      
      
      
          
          
          
          
          
      
  


最後再以插入資料作為測試

<%
        Person p = new Person();
        p.setName("jobs");
        Contact c = new Contact();
        c.setAddress("someRoad");
        c.setCellphone("0960000000");
        c.setTelphone("062222451");
        c.setEmail("ayu780129@hotmail.com");
        p.setContact(c);


        org.hibernate.SessionFactory sc = HibernateUtil.getSessionFactory();
        org.hibernate.Session ss = sc.openSession();
        org.hibernate.Transaction tx = ss.beginTransaction();
        ss.save(p);
        tx.commit();
        ss.close();
%>

沒有留言:

張貼留言