最重要的觀念就是針對 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();
%>
沒有留言:
張貼留言