2017-07-27 94 views
1

我正在使用Hibernate在內存數據庫中的H2上編寫測試代碼。我有兩個項目幾乎完全相同的配置。在每個測試代碼中,模型類自動構建數據庫模式。這兩個類定義的數據類型相同的方式:Hibernate在時態返回類型中不一致(日期與時間戳)

@Temporal(TemporalType.TIMESTAMP) 
@Column("MY_DATE") 
private java.util.Date myDate; 

從Hibernate的調試日誌,我可以看到創建的列是同一類型的兩個項目:

create table MY_TABLE (
    ... 
    MY_DATE timestamp, 
    ... 
) 

測試模型總是給定類型java.sql.Date

的對象出於某種原因,但是,在一個項目中,當我和一個Hibernate查詢檢索數據,類型爲java.sql.Date,而在其他的項目,它是java.sql.Timestamp

什麼可能導致這種行爲差異,以及如何一致地將此數據作爲java.sql.Date

(請記住,我只測試代碼的控制,我不能改變應用代碼。)

回答

0

當執行一個Hibernate查詢,如果它顯示了一個java.sql.Date例如,它是在Hibernate會被緩存的實例,而不是實際從持續的數據重新組合。當它返回java.sql.Timestamp實例時,實際上這是基於Temporal(TemporalType.TIMESTAMP)從持久數據中組合而來的。要始終如一地獲得Timestamp,請確保在查詢數據之前使用Session.evict。在問題的參數範圍內,不可能始終獲得Date實例(即需要更改應用程序代碼)。

(感謝,並upvotes奔,爲把我在正確的軌道上。)

2

我不確定知道爲什麼它們會受到不同回來 - 你看到的這種行爲在兩個項目之間的所有類似日期字段中?這就是說 - 儘管它們的迴歸方式不同,但是你提到你想要一直回到java.sql.Date - 這不是它們如何映射的。基於你的應該預期會回來的映射的正確類型是java.sql.Timestamp。如果你想java.sql.Date你應該使用@Temporal(TemporalType.DATE)

無論哪種方式 - 在您的代碼中,您應該只針對java.util.Date而不是針對底層的java.sql.*類進行編碼。

更爲理想的是,如果您使用Java 8,則使用java.time.LocalDateTime(或其分區等效項),否則使用org.joda.LocalDateTime

java.util.Datejava.sql.Date是噩夢hellrides :)

+0

Upvoted爲LocalDateTime'的'的建議或分區等同。如果你正在使用Java 6或7,有人說今天[java.time的後端](http://www.threeten.org/threetenbp/)是比Joda-Time更好的選擇。 –

+0

Upvoted因爲它把我放在正確的軌道上。儘管在應用程序代碼中,人們只想引用java.util.Date,但在測試代碼中這是不可能的。我需要使用'.equals'來比較從Hibernate返回的日期,'Timestamp.equals'對於'Date'的實例返回false,即使它們具有相同的毫秒值。除非我在這裏失去了一些東西,那就是。 – ds390s

相關問題