JPA 2.0 Oracle DATE具有空时

Gri*_*iff 5 oracle orm hibernate jpa date

这看起来像是一个傻瓜问题,但我一直在一棵树周围追逐我的尾巴.我有一个Struts 2 + Spring3/JPA/Hibernate应用程序,它将一个大型集合插入到数据库中.在集合中是Java util日期.我在Dao插入行之前检查了日期,所有日期都有正确的时间.插入后,Oracle DB中的所有行都没有时间,只有日期.就像时间被截断一样,但事务中没有出现错误.

在我发布任何代码之前我想过,我会问这个问题,看看是否有人可以提出我可能忽略的内容?数据库是Oracle 10g.JPA 2.0.列上有注释:

@Column(name = "READING_DATE")
@Temporal(TemporalType.DATE)
private Date readingDate;
Run Code Online (Sandbox Code Playgroud)

将Column类型设置为TemporalType.TIMESTAMP会导致Hibernate异常

column READING_DATE. Found: date, expected: timestamp
Run Code Online (Sandbox Code Playgroud)

任何/所有回复表示赞赏.

Pas*_*ent 11

对于这类问题,通常有助于提供JDBC驱动程序的版本和您正在使用的方言.

无论如何,我的理解是你实际上想要以下映射(对于DATE TIME):

@Column(name = "READING_DATE")
@Temporal(TemporalType.TIMESTAMP)
private Date readingDate;
Run Code Online (Sandbox Code Playgroud)

你遇到的问题在某种程度上与Oracle在版本9.2中引入的疯狂有关,请参阅DATE和TIMESTAMP会发生什么?(简而言之,他们引入了一个TIMESTAMP列并更改了DATESQL类型的映射,请阅读FAQ).有几种方法可以解决它(我当然假设您正在使用TemporalType.TIMESTAMP映射):

要么使用TIMESTAMP 列类型(我不是指TemporalType.TIMESTAMP这里,我的意思是DB侧的列类型).但如果您不需要纳秒精度,这不是最佳选择.

或者将oracle.jdbc.V8Compatible=true兼容模式设置为系统属性或连接属性:

<property name="hibernate.connection.oracle.jdbc.V8Compatible">true</property>
Run Code Online (Sandbox Code Playgroud)

是的,您可以像这样设置任意连接属性.从Hibernate文档:

3.3.JDBC连接

...

可以通过在"连接属性名称"前加上"hibernate.connection"来给出任意连接属性.例如,您可以使用指定charSet 连接属性hibernate.connection.charSet.

或者使用Oracle JDBC 11.1驱动程序(它们通过还原更改来"修复"问题).这是IMO理想的解决方案(这些V8Compatible东西已被弃用).

相关问题

  • 这就是疯狂! (2认同)