使用Oracle日期和休眠时的日期/时间的Java类型

使用Oracle日期和休眠时的日期/时间的Java类型

问题描述:

我们有一个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

不是一个直接的答案,但我会使用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

做出此更改后是否重新创建数据库?

如果Hibernate最初为该列使用java.sql.Date创建表,但我不知道它可以根据Java代码中的更改单独更改它。

首先 - 你是对的,你需要使用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

我总是使用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

也许你有this problem?确保你有最新的JDBC驱动程序,文件名应该是ojdbc5.jar。

您需要使用 @Type(TYPE = “org.joda.time.contrib.hibernate.PersistentDateTime”) 为您使用hbm2ddl.auto在实体类