2011-12-12 110 views
26

如果我們使用的缺席@Temporal註釋的休眠

@Column(name="birth_date", nullable=false, length=19) 
public Date getBirthDate() { 
    return this.birthDate; 
} 

代替

@Temporal(TemporalType.TIMESTAMP) 
@Column(name="birth_date", nullable=false, length=19) 
public Date getBirthDate() { 
    return this.birthDate; 
} 

是否有任何副作用,如果使用日期列屬性,而不@Temporal註釋?

+0

我會加入到這個問題和f的比較:convertDateTime ...關心。 –

回答

29

只有一條文檔編制的我設法找到:

在普通的Java API,時間時間精度沒有定義。在處理時態數據時,您可能想要描述數據庫中的預期精度。時間數據可以具有DATE,TIME或TIMESTAMP精度(即實際日期,僅時間或兩者)。使用@Temporal註釋來微調。

2.2.2.1. Declaring basic property mappings

可能表明數據庫中的實際日期表示沒有定義,並且確定最好直接指定它。

+3

+1 - 我還沒有找到任何片段更這將談什麼,如果沒有'@ Temporal'指定休眠會做。就像另外一個 - EclipseLink甚至不允許你定義時間精度。我寧願定義你所期望的確切精確度。 –

22

我意識到這個問題已經回答了,但我們有這個掙扎的今天,所以我想給誰對這個跨越未來絆倒人更深入的瞭解。

使用Oracle 11g與11級的驅動程序,如果你不使用的時間標註然後每日期,時間和時間戳數據從Oracle類型將映射到您的代碼在運行時的時間戳。在功能上這很好,但是這導致了我們嚴重的性能問題。這是因爲我們有一個DATE類型作爲複合主鍵的一部分。該列是索引的主要列,以及我們用於分區的列。當驅動程序嘗試使用where子句中的此列保留記錄時,Oracle會將數據庫中的數據從DATE執行到TIMESTAMP的類型轉換。這使索引無用,表現糟透了。

說來話長不再,隨時添加這個註釋免得你們要準備付出代價。

+0

+1的答案:) –

+0

與實時例子很好的解釋。 TY! – Diablo