當定義與資料表映射的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
}
參考:
沒有留言:
張貼留言