5

JPA 1.0 是否支持映射GregorianCalendar?我在 JPA 1.0 的映射文件规范中没有找到任何关于GregorianCalendar. JPA 2.0 怎么样?

4

4 回答 4

18

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

11.1.47 时间注释

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

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;

    // . . .
}
于 2010-07-19T23:39:23.107 回答
5

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

9.1.18 基本注解

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

于 2010-07-19T19:43:17.400 回答
1

一般来说,在 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 的灵活性,而不必担心时区和夏令时。

于 2011-09-05T02:01:35.893 回答
0

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

它会给你同样的结果。

于 2010-07-19T18:29:59.180 回答