JPA 和公历日历

Posted

技术标签:

【中文标题】JPA 和公历日历【英文标题】:JPA and GregorianCalendar 【发布时间】:2010-07-19 18:25:14 【问题描述】:

JPA 1.0 是否支持GregorianCalendar 的映射?我在 JPA 1.0 的映射文件规范中没有找到任何关于 GregorianCalendar 的内容。 JPA 2.0 呢?

【问题讨论】:

【参考方案1】:

JPA 确实支持 java.util.Calendar 及其子类。唯一需要注意的是,您必须使用 @Temporal 注释来指示字段在数据库中的存储方式。两个版本的规范都有这个要求,这是 JPA 2.0 规范中的部分:

11.1.47 时间注释

必须为持久字段或类型的属性指定时间注释 java.util.Date 和 java.util.Calendar。只能为以下字段或属性指定 这些类型。

Temporal注解可以与Basic注解、Id注解或ElementCollection[111]注解结合使用(当元素集合值是这种时间类型时)。

TemporalType 枚举定义了这些时间类型的映射。

public enum TemporalType 
DATE, //java.sql.Date
TIME, //java.sql.Time
TIMESTAMP //java.sql.Timestamp

否则,您无需做任何特别的事情。您的实体可能看起来像这样:

@Entity 
public class Person  
    // . . .

    @Temporal(TemporalType.TIMESTAMP)
    private GregorianCalendar lastUpdated;

    // . . .

【讨论】:

【参考方案2】:

JPA 允许映射java.util.Calendar(及其子类)。来自 JPA 1.0 规范:

9.1.18 基本注解

Basic注解是最简单的 映射到数据库列的类型。 基本注释可以应用于 持久性属性或实例 以下任何一项的变量 类型:Java 原始类型、包装器 原始类型中, java.lang.String, java.math.BigInteger, java.math.BigDecimal, java.util.Date, java.util.Calendarjava.sql.Datejava.sql.Timejava.sql.Timestamp, byte[], Byte[], char[], Character[], 枚举,以及任何其他类型 实现Serializable。作为 在第 2.1.6 节中描述,使用 Basic 注释是可选的 的持久字段和属性 这些类型。

【讨论】:

ID 显示 Date 已被弃用,当您移动到时,您会发现它说您必须使用日历,但我对 Entity 中的日历很感兴趣,谢谢。【参考方案3】:

一般而言,您必须小心在 JPA 或 JDBC 中使用日历或日期,因为它们通常在没有时区信息的情况下存储。因此,您的应用程序容易受到夏令时和时区差异的影响。

我在 JPA 上所做的如下:

我使用 Date 或您喜欢的任何 Java 时间对象创建 getter 和 setter(我更喜欢 Date 因为它的不变性),但实际列是 long 或 Long(不幸的是,这意味着需要进行空检查)

private Long timestamp;
public void setTimestamp(final Date timestamp) 
    if (timestamp == null) 
        this.timestamp = null;
     else 
        this.timestamp = timestamp.getTime();
    

public Date getTimestamp() 
    if (timestamp == null) 
        return null;
    
    return new Date(timestamp);

这为您的实体用户提供了 Java Date 的灵活性,而不必担心时区和夏令时。

【讨论】:

【参考方案4】:

您可以映射 java.util.Calendar 而无需特殊映射。

它会给你同样的结果。

【讨论】:

以上是关于JPA 和公历日历的主要内容,如果未能解决你的问题,请参考以下文章

Andorid 之日历控件,可左右滑动,包含公历,农历,节假日等

iOS中的日历

PHP 农历公历互转,八字排盘,星座,日历,支持从-1000到3000年间的排盘,二十四节气

Android 中的埃塞俄比亚日历

linux命令大全之cal命令详解(显示日历)

每日Linux命令-cal