2012-09-20 37 views
0

使用hibernate進行數據訪問。向NOT NULL表中添加空值,org.hibernate.exception.ConstraintViolationException

我在數據庫中的列:

varchar(40), default value is set to 0, NOT NULL 

我有一個情況下,用戶發送空值,並且收到錯誤:

Error: org.hibernate.exception.ConstraintViolationException: Cannot insert the value 
    NULL into column 'foo', table 'MyTable'; column does not allow nulls. INSERT fails. 

而且在休眠列的定義如下:

@Column(name = "foo") 
private String foo; 

問題在哪裏?我必須在休眠註釋或者smt中定義默認值嗎?怎麼樣?或者其他任何意見?

+0

爲什麼不是varchar默認值''? – ramsinb

+0

如果您想將NULL置於該列,爲什麼將該列定義爲NOT NULL?有沒有具體的原因? – shan

+0

@shan我不想把null放在那裏,我想把默認值放在那裏,當用戶把NULL – Jaanus

回答

2

當您嘗試將NULL插入NOT NULL列時,您會發生什麼?要麼執行NOT NULL約束,然後您需要拒絕用戶輸入,或者您想要接受NULL值,並且需要指定該列可以爲空,當然,使用@Column(nullable = true)


因爲你真正想要在列的默認值,當用戶不提供現場,和你的代碼明確地設置,即使它是空的字段值(或空,這是甲骨文相同,例如),我建議有關於該領域的更智能的設定器:

private String foo = "0"; 

public String getFoo() { 
    return foo; 
} 

public void setFoo(String foo) { 
    if (foo != null && !foo.isEmpty()) { // Or StringUtils.isNotBlank(foo) 
     this.foo = foo; 
    } 
} 
+0

我不想把null放在那裏,我想把默認值放在數據庫中,當用戶插入NULL時 – Jaanus

+0

然後在字段上分配一個默認值:'private String foo =「default」;'? –

+0

但我的代碼覆蓋它並將其設置爲空,我可以以某種方式發送null到非空列,並在數據庫中,當我看到null時,它將默認值設置在我的數據庫中。 「默認」不是那種方式嗎? – Jaanus

0

foo爲默認值將是零,因爲它是類的字段。

因爲它的默認值,你要保存的是0. 使foo原始類型,如果可能的話,即int如果foo必須是字符串,那麼你可以刪除非空約束,因爲即使你不指定值foo,則默認值爲0。

建議:考慮使用Hibernate-自動POJO類代工具。這將自動從現有數據庫生成POJO類。

+0

目前問題是數據庫在'foo'中保存了大量空值,但是我希望這裏有'0'而不是'null',並且它默認不會這樣做。 – Jaanus

+0

@Jaanus:你的數據庫將處於不一致的狀態。寫更新查詢將空值修改爲0.類似於:'update table set col = 0 where col is null' –

+0

它並不重要,我截斷了我的表,並且只需要所有將來的記錄保存值0而不是null。如何做到這一點? Vash解決方案接近我所需要的。 – Jaanus

0

如果你的表不允許空值,你應該尊重並採用你的模型。

當您使用@Column註釋時,您應該首先將屬性設置爲false,以支持默認值,您還應該使用列定義。

@Column(name = "foo", nullable = false, columnDefinition = 「varchar(40) default 0″) 
+0

我加了這個,還是得到同樣的錯誤。當我有varchar,我可以有'默認0'或必須做'默認'0''?任何建議? – Jaanus