2010-02-03 95 views
8

我們有一個Oracle日期列。起初在我們的Java/Hibernate類中,我們使用的是java.sql.Date。這工作,但它似乎並沒有在我們保存時在數據庫中存儲任何時間信息,所以我將Java數據類型更改爲Timestamp。現在,我們得到這個錯誤:使用Oracle日期和休眠時的日期/時間的Java類型

springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.dao.an notation.PersistenceExceptionTranslationPostProcessor#0' defined in class path resource [margin-service-domain -config.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreatio nException: Error creating bean with name 'sessionFactory' defined in class path resource [m-service-doma in-config.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Wrong column type: CREATE_TS, expected: timestamp

如何在保留時間部分映射一個Oracle Date任何想法?


更新:我可以,如果我使用Oracle Timestamp數據類型,它的工作,但我不希望的精度該級別最好。只需要基本的Oracle Date

+0

定義的列? – Bozho 2010-02-03 16:18:32

+0

不知道那是什麼 - 所以我猜不。 – 2010-02-03 16:33:25

+0

如果這是hibernate自動生成模式功能,那麼沒有。 – 2010-02-03 18:24:37

回答

7

不是一個直接的答案,但我會使用Oracle TIMESTAMP類型:

  • TIMESTAMP (fractional_seconds_ precision) Year, month, and day values of date, as well as hour, minute, and second values of time, where fractional_seconds_precision optionally specifies the number of digits in the fractional part of the SECOND datetime field and can be a number in the range 0 to 9. The default is 6. For example, you specify TIMESTAMP as a literal as follows:

    TIMESTAMP'1997-01-31 09:26:50.124' 
    

與所需fractional_second_precision

+0

好主意。使用它的精度爲2.最初的目標是使用Oracle'Date',但是這個工作正常。 – 2010-02-03 19:38:32

+1

這只是一個解決方法。看到我對布賴恩的答案的評論,爲什麼他的答案是解決你的原始問題。 – 2010-12-23 18:33:39

+0

當我這樣做時,hibernate將列(現在是時間戳類型)映射到String而不是Java中的Date。任何想法爲什麼? – kmehta 2011-03-25 23:27:38

0

做出此更改後是否重新創建數據庫?

如果Hibernate最初爲該列使用java.sql.Date創建表,但我不知道它可以根據Java代碼中的更改單獨更改它。

1

首先 - 你是對的,你需要使用java.sql.Timestamp類,因爲java.sql.Date類明確地不代表一天的特定時間(相反,它試圖表示午夜時分)。

至於你的錯誤 - 你還沒有給出足夠的信息做任何事情比猜測更多(這將需要看你的Hibernate配置和類以真正確定原因)。 但是,如果你只是改變了Java類中字段的類,那麼你當然也必須更新Hibernate映射。如果你沒有完成後者,那麼這可能會導致你的不匹配。嘗試明確指定type="timestamp"作爲相應的映射。

編輯:如果您使用註釋,那麼您是否更新該屬性的註釋到@Temporal(TemporalType.TIMESTAMP)?如果你沒有,那麼你將需要(如果你這樣做,你應該這樣說:-))。

+0

我使用註釋,沒有看到'type'字段可用。 – 2010-02-03 00:22:32

+0

試過,同樣的錯誤。想知道這是不是「春天的事情」。錯誤引用了Spring bean ... – 2010-02-03 16:07:46

8

我總是使用java.util.Date和Oracle日期,它處理日期和時間就好了。

+0

這是正確的答案。 Pascal使用TIMESTAMP類型列的答案只是一個解決方法。如果您被迫'使用DATE類型列(將Hibernate映射到您無法修改的現有模式),那麼您必須使用java.util.Date而不是java.sql.Date。這裏是一個類似的問題,涵蓋了這種情況:http://stackoverflow.com/questions/960923/mapping-an-oracle-date-to-a-java-object-using-hibernate – 2010-12-23 18:31:47

+1

我不會推薦這個。當使用java.util.Date時,Hibernate映射到它的TimestampType。然後,Oracle可能會將DATE列轉換爲TIMESTAMP,以便不使用現有的索引,並且性能將非常糟糕。更好地使用時間戳。 – 2012-01-05 14:28:54

0

您需要使用 @Type(TYPE = 「org.joda.time.contrib.hibernate.PersistentDateTime」) 爲您使用hbm2ddl.auto在實體類