我們正面臨着一個問題,即在基於Java的hibernate-spring REST API的Postgres表中存儲timestamp的DEFAULT值。Postgres時間戳列的默認值設置沒有得到正確使用
列設置爲
load_ts timestamp with time zone DEFAULT timezone('utc'::text, now()) NOT NULL,
我們不從我們的代碼發送的任何時間戳值。 這是我們如何在實體類中指定時間戳字段。
@Column(name = "LOAD_TS", insertable = false, updatable = false)
private Timestamp loadTimeStamp;
我們正在使用Amazon RDS Postgres DB。 DB參數組值'timezone'設置爲'UTC'。
預期 - 當沒有任何load_ts值發送到數據庫的插入請求到達數據庫時,load_ts應根據默認設置獲取UTC的時間戳。
實際 - 當插入請求到達數據庫時沒有任何load_ts值發送到數據庫時,load_ts將設置爲EASTERN TIME + 10小時。 API在東部時間運行。
當我們在DB中手動插入記錄時,時間戳會被正確生成並存儲。我們查看了RDS postgres中的log_statements,但沒有看到API在插入查詢中發送任何時間戳。另一個有趣的觀察是,當我們將API時區更改爲UTC時,時間戳被正確存儲。所以不知何故API正在將時區傳遞給數據庫。
應用棧 - 1)休眠芯版本 - 5.0.7
2)彈簧 - 4.2
3)的Postgres - 9.4
4)的Postgres駕駛員 - 9.4.1212.jre7
5)RDS Postgres DB時區參數組值 - UTC
6)應用程序在美國東部時間運行的時區。
謝謝Peter的建議。我們想到做同樣的改變。我只是有點困惑,爲什麼只有當我通過hibernate應用程序插入數據時纔會發生這個問題。當我使用普通的sql插入語句插入數據時,時間戳是正確的。可能在這種情況下,timezone()會返回時區和時區的時間戳。 –
由於從'沒有時區的時間戳'(函數結果)到'具有時區的時間戳記'(列類型)的轉換考慮了會話時區。如果您的應用程序和psql會話配置了不同的時區,則結果將會不同。 –
感謝Ton了! –