2013-02-05 37 views

回答

53

插入日期列時得到null值的原因(即使它被定義爲default SYSDATE dbms端)是因爲列的default值僅在查詢中未給定列時使用。這意味着它不得出現在INSERT INTO句子中,即使它已被授予null

如果你想在DBMS側使用default SYSDATE,你應該爲了得到列出你的SQL INSERT S的配置@Columninsertable=false

@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "myDate", insertable=false) 
private Date myDate; 

考慮到這種方法將始終忽略您在創建實體時嚮應用中的屬性提供的值。如果您確實希望能夠提供日期,也許您應該考慮使用數據庫觸發器來設置值而不是默認值。

還有一種方法可以使用DBMS的default SYSDATE定義。您可以使用@PrePersist@PreUpdate註解當前日期分配給屬性,之前保存/更新,當且僅當它尚未分配:

@PrePersist 
protected void onCreate() { 
    if (myDate == null) { myDate = new Date(); } 
} 

此密切相關的問題提供了不同的方法:Creation timestamp and last update timestamp with Hibernate and MySQL

+1

感謝非常詳細的解釋哈維。這超出了我的期望,它確實有效! – BruceCui

+0

@ user1900240很高興幫助:) –

+0

insertable = false對我不起作用。我正在使用Postgres,並且在列上設置了一個默認值,但它的值爲null。 –

0

或者你可以初始化POJO的財產直接e.g

// Java代碼財產申報

私人字符串姓= 「默認」;

+0

它適用於字符串,而不是日期值 – rajadilipkolli

1

只要把插入你=假 @column定義

看到這個link以獲取更多信息

9

如果您正在使用Hibernate,那麼你可以只使用@CreationTimestamp插入默認的日期。

@CreationTimestamp 
@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "create_date") 
private Date createDate; 

@UpdateTimestamp更新值,如果必要

@UpdateTimestamp 
@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "modify_date") 
private Date modifyDate; 
+0

這對我來說 - 一直在尋找這個答案!謝謝你,@rajadilipkolli :) – Custard

+0

做這些工作與Java 8的'ZonedDateTime'? –

+0

這是爲我工作,第一個答案沒有工作。謝謝@rajadilipkolli – Doug

相關問題