在 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 );
日期或时间戳字段的 col.getSqlType( dialect, mapping ) 是日期。columnInfo.getTypeName() 是时间戳,因此 if 查询的第一部分将不匹配
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)。
交叉张贴在休眠论坛上