2014年9月15日 星期一

@NotNull vs. @Column(nullable = false)


Annotation 很好用,但是很多時候也讓人很疑惑,就像用JPA在設計Model (or Domain or POJO?)時,如果我要規定這個值不能能是Null 那應該是要用@NotNull 還是  @Column(nullable = false) 甚至是@NotEmpty !? 其實兩個一點都不衝突,只是施力的地方不一樣。

 

@NotNull 是 JSR-000303 Bean Validation 的規範,也就是說它是以Java POJO 的角度來檢視,生成這個物件的時候,不允許這個attribute 是Null否則就會拋出RuntimeException (ValidationException)

@Column(nullable = false) 才是屬於JPA跟Database 有關的範疇,在這邊的nullable =false 是用來定義Databse Table 的屬性,於是JPA會幫你轉會成以下語法去產生Table (NOT NULL)

CREATE TABLE PersonsNotNull
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

根據文件解釋 Attribute is generally only used when generating the table definitions, and not used at runtime for validation。所以如果只靠這個設定,當你有Null的值 JPA Level並不會偵測到這個錯誤,必須等到寫入DB,由DB Table Level 才會發現。



所以為了方便,最好兩個都使用.....會不會POJO都不POJO了...:P


張貼留言