我们有一个Oracle Date列。首先在我们的Java / Hibernate类中,我们使用java.sql.Date
。这有效,但是当我们保存时它似乎没有在数据库中存储任何时间信息所以我将Java数据类型更改为Timestamp。现在我们得到了这个错误:
springframework.beans.factory.BeanCreationException: 使用名称创建bean时出错 “org.springframework.dao.an notation.PersistenceExceptionTranslationPostProcessor#0' 在类路径资源中定义 [余量服务域 -config.xml]:bean的初始化失败;嵌套异常是 org.springframework.beans.factory.BeanCreatio nException:创建bean时出错 在类中定义的名称'sessionFactory' 路径资源[m-service-doma in-config.xml]:init的调用 方法失败;嵌套异常是 org.hibernate.HibernateException: 错误的列类型:CREATE_TS, 预期:时间戳
有关如何在保留时间部分的同时映射Oracle Date
的任何想法?
更新:如果我使用Oracle Timestamp
数据类型,我可以让它工作,但我不希望理想的精确度。只需要基本的Oracle Date
。
答案 0 :(得分:8)
我总是将java.util.Date与Oracle日期一起使用,它处理日期和时间就好了。
答案 1 :(得分:7)
不是直接的答案,但我使用Oracle TIMESTAMP类型:
TIMESTAMP(fractional_seconds_ precision)年,月和日值 日期,以及小时,分钟和 第二个时间值,在哪里
fractional_seconds_precision
可选地指定数量 小数部分的数字SECOND
日期时间字段,可以是 数字在0到9范围内 默认值为6.例如,您指定TIMESTAMP
字面如下:TIMESTAMP'1997-01-31 09:26:50.124'
带有所需的fractional_second_precision
。
答案 2 :(得分:2)
也许你有this problem?确保你有最新的JDBC驱动程序,文件名应该是ojdbc5.jar。
答案 3 :(得分:1)
首先 - 你是正确的,你需要使用java.sql.Timestamp类,因为java.sql.Date类显然不代表一天中的特定时间(相反,它试图代表午夜GMT)。
至于你的错误 - 你没有提供足够的信息来做任何事情而不是猜测(它需要查看你的Hibernate配置和类来实际确定原因)。 但是,如果您只是更改了Java类中字段的类,那么当然您也必须更新Hibernate映射。如果你还没有完成后者,那么这可能会导致你的不匹配。尝试为相应的映射明确指定type="timestamp"
。
编辑:如果您正在使用注释,那么您是否将该属性的注释更新为@Temporal(TemporalType.TIMESTAMP)
?如果你没有,那么你需要(如果你这样做,你应该这样说: - ))。
答案 4 :(得分:0)
您在进行此更改后是否重新创建了数据库?
如果Hibernate最初使用java.sql.Date为列创建表,我不知道它可以根据单独的Java代码更改来改变它。
答案 5 :(得分:0)
你需要使用 @Type(type =“org.joda.time.contrib.hibernate.PersistentDateTime”) 对于实体类
中定义的列