2013-04-03 17 views
5

我發現代碼實體類:任何理由把@NotNull註釋上@Id領域的Java實體類

@Id 
@NotNull 
@Column(name = "ID") 
private Long id; 

@NotNull標註有值時@Id已經設置?

+3

如果您使用數據庫自​​動增量值或序列,則不應使用'@NotNull'註釋。當你嘗試堅持實體時它會拋出一個異常。 – greenkode

+0

Hm ...我簡化了代碼,但原來的代碼有'@ SequenceGenerator'和'@ GeneratedValue',並且在運行時沒有任何插入錯誤...看起來不同的庫和版本的行爲不同。感謝您的關注。 +1。 – gavenkoa

回答

6

@NotNull是爲了進行驗證,如@Size。它爲驗證引擎定義規則來檢查用戶輸入是否正常。圍繞這些註釋做驗證並不一定表明該對象也是JPA對象,但這兩者經常一起使用。

如果您使用的是javax.validation而不是依靠數據庫級別的失敗(約束違規)來指示空值,那麼您應該同時使用這兩個註釋。

+0

謝謝+1。最直接的答案。 – gavenkoa

0

我的理解是這是用於靜態分析,並沒有與hibernate/orm做關係。它是否是intellij特定的註釋?

因此,在編譯時,當您要將NULL指定爲已註釋爲@NotNull的字段時,可能會發出警告。

而且任何依賴的代碼都知道返回值永遠不會爲空。

+2

它來自JSR303(Bean Validation),它與JPA一樣也是Java EE的一部分。 – BalusC

1

由於id/primary key是表中最重要的field,因此uniquely標識表中的一行。因此它不應該是null

1

@Id用於

* Specifies the primary key of an entity. 
* The field or property to which the <code>Id</code> annotation is applied 
* should be one of the following types: any Java primitive type; 
* any primitive wrapper type; 
* <code>String</code>; 
* <code>java.util.Date</code>; 
* <code>java.sql.Date</code>; 
* <code>java.math.BigDecimal</code>; 
* <code>java.math.BigInteger</code>. 

所以也沒有采取空值的照顧。爲了防止空值@NotNull@Id一起使用。

+0

謝謝。 +1。我閱讀http://docs.oracle.com/javaee/6/api/javax/validation/constraints/NotNull.html和http://docs.oracle.com/javaee/6/api/javax/persistence/Id。 HTML但這並不能幫助我理解... – gavenkoa

+0

允許空主鍵將違反SQL規範。 – Powerlord

0

是的,這將使你的ID字段不可爲空,你必須強制它。

但如果你要ID爲自動增量然後將其刪除,並添加

@GeneratedValue(策略= GenerationType.AUTO)