【问题标题】:Mapping ORACLE TIMESTAMP(9) field to java.util.Date将 ORACLE TIMESTAMP(9) 字段映射到 java.util.Date
【发布时间】: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 );
  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)。

在休眠论坛上交叉发布here

【问题讨论】:

  • 当我禁用 hbm2ddl.auto 时它起作用了。知道为什么它在验证时失败了吗? TIMESTAMP(9) 的 columnInfo.getTypeCode() 不应该也返回对应于 Types.TIMESTAMP 的代码。
  • columnInfo.getTypeCode 来自您的 JDBC 驱动程序报告的元数据。
  • 是的。不确定这是否是所有 ojdbc 版本的问题。无论如何 ojdbc 11.2.0.1.0 距离最新的(即 ojdbc 11.2.0.3)并不太远。

标签: oracle hibernate jdbc


【解决方案1】:

我禁用了架构验证,它工作正常。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-04-02
      • 2011-02-10
      • 2023-03-12
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      • 2018-07-29
      相关资源
      最近更新 更多