JPA和GregorianCalendar

时间:2010-07-19 18:25:14

标签: java jpa orm jpa-2.0

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

4 个答案:

答案 0 :(得分:18)

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;

    // . . .
}

答案 1 :(得分:5)

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

  

9.1.18基本注释

     

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

答案 2 :(得分:1)

一般情况下,您必须注意使用JPA或JDBC的日历或日期,因为它们通常不会存储时区信息。因此,您的应用程序将容易受到夏令时和时区的影响。

我在JPA上做的如下:

我使用Date或您熟悉的任何Java时态对象创建一个getter和setter(我更喜欢Date的不变性)但是实际列是long或Long(不幸的是它意味着需要进行null检查)< / p>

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的灵活性,而无需关心时区和夏令时。

答案 3 :(得分:0)

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

它会给你相同的结果。