代码之家  ›  专栏  ›  技术社区  ›  Griff

JPA 2.0 Oracle日期的时间为空

  •  5
  • Griff  · 技术社区  · 14 年前

    这似乎是一个愚蠢的问题,但我一整天都在树上追逐我的尾巴。我有一个struts 2+spring3/jpa/hibernate应用程序,它在数据库中插入一个大的集合。在集合中是一个Java UTL日期。我检查了DAO插入行之前的日期,所有日期的时间都是正确的。插入之后,Oracle数据库中的所有行都没有时间,只有日期。好像时间被截断了,但事务中没有出现错误。

    我想在我发布任何代码之前,我会问一个问题,看看是否有人可以建议我可能忽略的东西?数据库是Oracle10g.jpa 2.0。列上有注释:

    @Column(name = "READING_DATE")
    @Temporal(TemporalType.DATE)
    private Date readingDate;
    

    将列类型设置为temporaltype.timestamp会导致休眠异常

    column READING_DATE. Found: date, expected: timestamp
    

    感谢您的任何/所有回复。

    2 回复  |  直到 12 年前
        1
  •  11
  •   ilCatania    13 年前

    对于这种问题,它通常有助于提供JDBC驱动程序的版本和您使用的方言。

    不管怎样,我的理解是您实际上想要以下映射(用于日期 时间):

    @Column(name = "READING_DATE")
    @Temporal(TemporalType.TIMESTAMP)
    private Date readingDate;
    

    您所面临的问题不知何故与Oracle 9.2版引入的疯狂有关,请参见 What is going on with DATE and TIMESTAMP? (简而言之,他们引入了 TIMESTAMP 并更改了 DATE SQL类型,请阅读常见问题解答)。有几个选项可以解决它(我当然假设您使用的是 TemporalType.TIMESTAMP 映射):

    要么使用 时间戳 列类型 (我不是指 临时类型.timestamp 这里,我指的是db端的列类型)。但如果你不需要纳秒级的精度,这不是最好的选择。

    或设置 oracle.jdbc.V8Compatible=true 兼容模式,作为系统属性或连接属性:

    <property name="hibernate.connection.oracle.jdbc.V8Compatible">true</property>
    

    是的,您可以这样设置任意连接属性。从Hibernate文档中:

    3.3. JDBC connections

    可以通过在连接属性名称前加上“hibernate.connection”来提供任意连接属性。例如,可以指定 charSet 连接属性使用 hibernate.connection.charSet .

    或者使用OracleJDBC11.1驱动程序(它们通过恢复更改来“修复”问题)。这是理想的解决方案 V8Compatible 东西被弃用了)。

    相关问题

        2
  •  0
  •   prashant thakre    12 年前

    使用ojdbc6.jar并对hibernate 3.3使用以下代码 设置时间戳而不是java.sql.date或java.util.date

    @Id
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "TDATE", length = 7)
    public Date getTdate() {
        return this.tdate;
    }