使用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
。
不是一个直接的答案,但我会使用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 theSECOND
datetime field and can be a number in the range 0 to 9. The default is 6. For example, you specifyTIMESTAMP
as a literal as follows:TIMESTAMP'1997-01-31 09:26:50.124'
与所需fractional_second_precision
。
好主意。使用它的精度为2.最初的目标是使用Oracle'Date',但是这个工作正常。 – 2010-02-03 19:38:32
这只是一个解决方法。看到我对布赖恩的答案的评论,为什么他的答案是解决你的原始问题。 – 2010-12-23 18:33:39
当我这样做时,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)
?如果你没有,那么你将需要(如果你这样做,你应该这样说:-))。
我使用注释,没有看到'type'字段可用。 – 2010-02-03 00:22:32
试过,同样的错误。想知道这是不是“春天的事情”。错误引用了Spring bean ... – 2010-02-03 16:07:46
我总是使用java.util.Date和Oracle日期,它处理日期和时间就好了。
这是正确的答案。 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
我不会推荐这个。当使用java.util.Date时,Hibernate映射到它的TimestampType。然后,Oracle可能会将DATE列转换为TIMESTAMP,以便不使用现有的索引,并且性能将非常糟糕。更好地使用时间戳。 – 2012-01-05 14:28:54
您需要使用 @Type(TYPE = “org.joda.time.contrib.hibernate.PersistentDateTime”) 为您使用hbm2ddl.auto在实体类
定义的列? – Bozho 2010-02-03 16:18:32
不知道那是什么 - 所以我猜不。 – 2010-02-03 16:33:25
如果这是hibernate自动生成模式功能,那么没有。 – 2010-02-03 18:24:37