網頁

2019/6/12

Hibernate JPA Entity屬性應該用原始型別(Primitive type)或包裹類別(Wrapper class)

當定義與資料表映射的Entity class(實體類別)時,若Entity屬性(成員變數)對映的資料表欄位是基本資料型態(例如整數(INTEGER),長整數(BIGINT),浮點數(DOUBLE)等),那應該用原始型別(Primitive type)還是包裹類別(Wrapper class)來定義Entity的屬性呢?

Hibernate用以上兩種都可以。不過若定義成Primitive type,當對映的欄位值為null時,在欄位資料映射至Entity的屬性時可能會出現下面錯誤。

org.hibernate.PropertyAccessException: Null value was assigned to a property of xxx type


另一個問題是,當Entity的資料映射回資料表時,Primitive type的屬性因為不允許null,所以會給定預設初值,例如int預設為0,因此資料表對映的欄位也會是0,但在某些場景下,資料表欄位的資料可能維持null會比較適合。

例如會員輸入個人資料時,並不強迫輸入年齡資料。若使用者沒輸入年齡且屬性為Primitive type,當Entity的年齡屬性映射回資料表時,資料表的年齡欄位值會是0,這可能導致在另一地方查詢使用者資料時造成誤判。

所以Entity屬性的資料型態建議還是宣告為包裹類別(Wrapper class),當資料表欄位為null時才可正確的反應出來。

@Entity(name = "Member")
public static class Member {

    @Id
    private Long id;

    private String name;

    private Integer age;

    // 省略getter setter
}

參考:

沒有留言:

張貼留言