【发布时间】:2012-07-16 20:38:10
【问题描述】:
在 Java 中将 ORACLE TIMESTAMP(9) 字段映射到 java.sql.Timestamp 或 java.util.Date 时遇到问题 版本:- ojdbc 11.2.0.1.0 休眠注释 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)。
在休眠论坛上交叉发布here
【问题讨论】:
-
当我禁用 hbm2ddl.auto 时它起作用了。知道为什么它在验证时失败了吗? TIMESTAMP(9) 的 columnInfo.getTypeCode() 不应该也返回对应于 Types.TIMESTAMP 的代码。
-
columnInfo.getTypeCode 来自您的 JDBC 驱动程序报告的元数据。
-
是的。不确定这是否是所有 ojdbc 版本的问题。无论如何 ojdbc 11.2.0.1.0 距离最新的(即 ojdbc 11.2.0.3)并不太远。