【问题标题】:Java: JPA classes, refactoring from Date to DateTimeJava:JPA 类,从 Date 重构为 DateTime
【发布时间】:2011-02-24 05:13:46
【问题描述】:

使用此 SQL 创建的表

Create Table X (
    ID varchar(4) Not Null,
    XDATE date
);

和这样定义的实体类

@Entity
@Table(name = "X")
public class X implements Serializable {
    @Id
    @Basic(optional = false)
    @Column(name = "ID", nullable = false, length = 4)
    private String id;
    @Column(name = "XDATE")
    @Temporal(TemporalType.DATE)
    private Date xDate; //java.util.Date
    ...
}

有了上面,我就可以使用JPA来实现对象关系映射了。但是,xDate 属性只能存储日期,例如dd/MM/yyyy.

如何重构上述内容以仅使用一个字段(即dd/MM/yyyy HH24:mm)存储完整的日期对象?

【问题讨论】:

    标签: java sql datetime orm jpa


    【解决方案1】:

    如果您还想在数据库级别存储时间信息,请使用TemporalType.DATETIME

    @Column(name = "XDATE")
    @Temporal(TemporalType.DATETIME)
    private Date xDate; //java.util.Date
    

    在数据库级别使用TIMESTAMP 列类型(并且xDate 将存储为'yyyy-MM-dd HH:mm:ss.S')。

    【讨论】:

    • +1 @Pascal Thivent :感谢您的回答,你们俩都是对的,但自从 sblundy 第一次加入以来,我就把支票交给了他。
    • 嗨。我正在使用带有EclipseLink 的JPA,而TemporalType 只有选项DATETIMETIMESTAMP,而不是DATETIME。我应该使用TIMESTAMP 还是TIME
    • 奇怪 - 我没有看到 DATETIME 作为选项,我只看到 TemporalType.TIME、TemporalType.DATE、TemporalType.TIMESTAMP。我正在使用 JPA2 w/Eclipselink 2.3.2.v20111125-r10461
    【解决方案2】:

    您是否尝试将@Temporal 值更改为TemporalType.DATETIME? java.util.Date 和 java.sql.Date 都存储日期和时间组件,TemporalType 控制 JPA 存储/关注的部分;日期、时间或两者兼有。

    【讨论】:

    • @sblundy :感谢您的回答,这也是我的直觉,但是,我是否需要更改实体类中的成员变量或表的架构定义?
    • @bguiz :没有字段,列是。这取决于您使用的是哪个数据库,但 DATETIME 应该可以工作
    • @sblundy:我正在使用 Toplink / JavaDB
    • @bguiz:时间戳。这是相关的手册页db.apache.org/derby/docs/dev/ref/ref-single.html#crefsqlj31068
    • @sblundy: java.sql.Date 存储时间组件。
    猜你喜欢
    • 2018-05-29
    • 1970-01-01
    • 2012-12-14
    • 2010-11-22
    • 2014-08-12
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多