2010年10月2日 星期六

Hibernate 教學 - Entity Type 與 Value Type

之前文章出現過很多 Entity Type,例如 一對多 (Entity Type) ....等

Entity Type 可以看成是"個體型別"的意思,Value Type 則是"值型別"

區分他們的方法很簡單,以之前一對多....等 的例子來看

Room 和 Student 類別都有一個屬性 id,透過這個 id 我們可以識別不同的物件

在資料庫的領域裡,如果要識別不同的資料可以透過主鍵


這時候如果在類別中有一個可以識別物件的屬性且又對應到資料庫的主鍵時


則這個類別就是 個體型別 (Entity Type)


反之如果不存在任何一個屬性能對應到主鍵時則稱之為 值型別 (Value Type)



首先以 Room 和 Student 的例子來看,

class Room
{
    private Long id;  //識別物件的屬性, 也對應到資料庫的主鍵
    private String name;
    private Set student;   //Room reference(引用)到 Student
}
class Student
{
    private Long id;   //識別物件的屬性, 也對應到資料庫的主鍵
    private String name;
    private Room room;   //Student reference 到 Room
}


如果今天加入一份資料叫做 Room 的圖片


如果今天需求只需要儲存這些圖片的檔名則不需要設計 Photo 這個類別了


直接以 String 的型別即可(Value Type)


如下:
class Room
{
    private Long id;  
    private String name;
    private Set photo;  
    
    public Set getPhoto(){
        return photo;
    }
    public void setPhoto(Set photo){
        this.photo = photo;
    }
    public void addPhoto(String photoName){  //String
        photo.add(photoName);
    }
    public void removePhoto(String photoName){ //String
        photo.remove(photoName);
    }
}


以上是一個簡單的一對多(Value Type)的例子


並沒有一個叫做 Photo 的類別,但他有一個資料表存放他的 photoName


可是到這邊或許你會有個疑問就是 剛剛不是說


如果在類別中沒有一個可以識別物件的屬性且對應到資料庫的主鍵時叫做 Value Type 嗎????


顯然的剛剛連一個所謂的 Photo 的類別都沒有,哪來的屬性


剛剛的例子也算是值型別的一種,如果你真的要加入一個叫做 photo 的類別


也是可以的,但要考量到為什麼要這麼做


或許你必須一定要加入圖片的長、寬、日期....之類的


那的確可以加入一個類別,如下


class Photo  //注意這邊沒有能識別物件的屬性
{
    private String photoName;
    private int height;
    private int weight;
    private String date;
    //.......
}


這時候 Room 的 photo 屬性可是 reference 到 Photo 了


且 Photo 有對應到的資料表存放照片名、長寬、日期等


但是 Photo 並沒有一個能識別物件的屬性並對應到資料表的主鍵


所以這也是一個 Value Type 的例子




剛剛的兩個例子之後都會在說明


如果想要知道更詳細的 Entity type


不妨去 


Java EE 6 Tutorial 


看看吧

沒有留言:

張貼留言