【问题标题】:Hibernate date, timestamp type confusing休眠日期、时间戳类型令人困惑
【发布时间】:2019-05-28 01:18:13
【问题描述】:

我是休眠新手,请帮助我。谢谢。

我对@9​​87654322@、javaoracle 的类型感到困惑。

  1. 我在 Oracle 11g 数据库中有 2 种数据类型。 -> Date, Timestamp(6)

  2. 我使用 hibernate 映射这个。 -> date, timestamp

  3. 它可以映射,比如Date(DB)timestamp(hbm)Date(DB)Date(hbm)

  4. 反之亦然timestamp(DB)date(hbm)timestamp(DBtimestamp(hbm)

  5. 那么我应该在 Java 代码中使用什么类型呢?

Oracle DB / Hibernate / Java 代码

  1. 日期/日期/日期还是时间戳??

  2. 日期/时间戳/日期还是时间戳??

  3. 时间戳/日期/日期还是时间戳??

  4. 时间戳/时间戳/日期还是时间戳??

四种情况都有可能吗?我很困惑..我在我的 oracle 数据库中进行了测试。

出现一些问题,比如我无法保存小时、分钟、秒......

帮助我了解休眠的基础知识。

hbm.xml 映射文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        <property name="hibernate.connection.url">jdbc:oracle:thin:@127.0.0.1:1521:oracle</property>
        <property name="hibernate.connection.username">scott</property>
        <property name="hibernate.connection.password">scott</property>
        <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
        <!-- <property name="hibernate.default_schema">MKYONG</property> -->
        <property name="show_sql">true</property>
        <mapping resource="com/mkyong/user/DBUser.hbm.xml"></mapping>
    </session-factory>
</hibernate-configuration>

用户代码 (java)

public class DBUser implements java.io.Serializable {
    private int userId;
    private String username;
    private String createdBy;
    private Date createdDate;
    private Date createdTimestamp;
    private String createdTest;
    //something getter setter ~~
}

【问题讨论】:

  • 查看 Oracle 的 documentation,其中显示了 Oracle 到 Java 类型的精确映射表。

标签: java oracle hibernate date timestamp


【解决方案1】:

您可以同时使用 HBM 和 JAVA。

java.sql.Timestamp 用于时间戳。 Oracle 中的时间戳 java.sql.Date 表示日期。 Oracle 中的日期

以上两个类都是从 java.util.Date 扩展而来的。您可以对两者都使用 java.sql.Timestamp,但时间组件将在 INSERT/UPDATE 期间被 Oracle 丢弃用于 DATE。对 DATE 使用 java.sql.Date 会让您更清楚。

从 Java 8 开始,您可以在下面使用。

org.hibernate.type.LocalDateType - Maps a java.time.LocalDate to a Oracle DATE    
org.hibernate.type.LocalDateTimeType - Maps a java.time.LocalDateTime to a Oracle TIMESTAMP

【讨论】:

  • 实际上,所有这些糟糕的日期时间类在几年前都被现代的 java.time 类所取代。 JDBC 4.2 及更高版本提供java.time 对象的直接交换。 Hibernate 也已更新:hibernate.atlassian.net/plugins/servlet/mobile#issue/HHH-8844。无需再接触java.sql.TimestampJava.sql.Datejava.util.Date 类。
  • 谢谢@BasilBourque,我的答案接近问题。现在我已经为 Java 8 更新了它。
猜你喜欢
  • 1970-01-01
  • 2021-07-18
  • 2012-09-12
  • 1970-01-01
  • 2010-12-23
  • 2020-05-15
  • 2016-06-12
  • 2014-11-16
  • 1970-01-01
相关资源
最近更新 更多