代码之家  ›  专栏  ›  技术社区  ›  Candy Chiu

JPA和GregorianCalendar

  •  5
  • Candy Chiu  · 技术社区  · 14 年前

    JPA1.0是否支持 GregorianCalendar ? 我在JPA1.0的映射文件规范中没有找到任何关于 格雷戈里安卡伦达

    4 回复  |  直到 14 年前
        1
  •  18
  •   Mike    14 年前

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

    11.1.47时间注释

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

    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
  •  5
  •   Pascal Thivent    14 年前

    java.util.Calendar (及其子类)。根据JPA 1.0规范:

    9.1.18基本注释

    映射到数据库列的类型。 持久属性或实例 类型:Java基本类型、包装器 java.lang.String , java.math.BigInteger , java.math.BigDecimal java.util.Date java.util.Calendar文件 , java.sql.Date , java.sql.Time , java.sql.Timestamp byte[] Byte[] , char[] , Character[] , 枚举,以及 工具 Serializable . 作为 如第2.1.6节所述,使用 基本注释是可选的 持久化域及其性质

        3
  •  1
  •   Archimedes Trajano    13 年前

    通常,您必须注意在JPA或JDBC中使用日历或日期,因为它们通常没有时区信息。因此,您的应用程序可能会受到夏令时和时区差异的影响。

    我在JPA上的工作如下:

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

    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日期的灵活性,而不必考虑时区和夏令时。

        4
  •  0
  •   m_vitaly    14 年前

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

    它会给你同样的结果。