1

在 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( dialect, mapping ) 是日期。columnInfo.getTypeName() 是时间戳,因此 if 查询的第一部分将不匹配

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

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

交叉张贴休眠论坛上

4

2 回答 2

0

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

于 2012-07-17T21:31:48.867 回答
0

我禁用了模式验证,它工作正常。

禁用架构验证?——史蒂夫·埃伯索尔

于 2012-07-20T09:18:37.270 回答