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.Calendar
、java.sql.Date
、java.sql.Time
、java.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 之日历控件,可左右滑动,包含公历,农历,节假日等