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

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

【问题讨论】:

    标签: java jpa orm 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 而无需特殊映射。

        它会给你同样的结果。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-22
          • 2015-08-23
          • 1970-01-01
          • 2019-06-21
          • 1970-01-01
          • 2018-10-23
          相关资源
          最近更新 更多