在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(方言,映射)是日期。 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)。
在hibernate论坛上发布here
答案 0 :(得分:0)
尝试使用@Temporal注释。这可能解释了hibernate要做什么
答案 1 :(得分:0)
我禁用了架构验证,但它运行正常。
禁用架构验证? - Steve Ebersole