将ORACLE TIMESTAMP(9)字段映射到java.util.Date

时间:2012-07-17 20:55:07

标签: oracle hibernate jdbc

在Java中将ORACLE TIMESTAMP(9)字段映射到java.sql.Timestamp或java.util.Date时遇到问题 版本: - ojdbc 11.2.0.1.0 hibernate-annotations 3.3.1.GA ejb3-persistence 1.0.1.GA

尝试映射

UPDATE_TIMESTAMP_9 TIMESTAMP(9) NULL
TO
@Column(name = "UPDATE_TIMESTAMP_9")
private Date updateTimestamp_9;

获取例外

org.hibernate.HibernateException: Wrong column type in EMPLOYEE.EMPLOYEE for column UPDATE_TIMESTAMP_9. Found: timestamp, expected: date

在进一步调查时,我发现代码在Table.java中的以下行返回'false'

final boolean typesMatch = col.getSqlType( dialect, mapping ).toLowerCase()
                  .startsWith( columnInfo.getTypeName().toLowerCase() )
                  || columnInfo.getTypeCode() == col.getSqlTypeCode( mapping );
  1. 日期或时间戳字段的col.getSqlType(方言,映射)是日期。 columnInfo.getTypeName()是时间戳,因此if查询的第一部分将不匹配

  2. col.getSqlTypeCode(mapping)返回93(这是Types.TIMESTAMP的代码)。但是,columnInfo.getTypeCode()返回1111.所以即使查询的第二部分也不匹配。

  3. 问题是为字段UPDATE_TIMESTAMP_9填充ColumnMetadata rs.getInt(“DATA_TYPE”)时返回1111,它是Types.OTHER的代码。请注意,如果我在oracle columnInfo.getTypeCode()中使用TIMESTAMP(6)字段,则正确返回93并且代码成功插入记录。问题仅出在TIMESTAMP(9)。

    在hibernate论坛上发布here

2 个答案:

答案 0 :(得分:0)

尝试使用@Temporal注释。这可能解释了hibernate要做什么

答案 1 :(得分:0)

我禁用了架构验证,但它运行正常。

  

禁用架构验证? - Steve Ebersole