JPA 1.0 是否支持映射GregorianCalendar
?我在 JPA 1.0 的映射文件规范中没有找到任何关于GregorianCalendar
. JPA 2.0 怎么样?
4 回答
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;
// . . .
}
JPA 允许映射java.util.Calendar
(及其子类)。从 JPA 1.0 规范:
9.1.18 基本注解
Basic 注释是映射到数据库列的最简单类型。Basic 注释可以应用于以下任何类型的持久属性或实例变量:Java 原始类型、原始 类型的 包装
java.lang.String
器 、、、、、、、、、、、、、、、、、、枚举java.math.BigInteger
和java.math.BigDecimal
任何 其他实现的类型 . 如第 2.1.6 节所述,基本注释的使用对于这些类型的持久字段和属性是可选的。java.util.Date
java.util.Calendar
java.sql.Date
java.sql.Time
java.sql.Timestamp
byte[]
Byte[]
char[]
Character[]
Serializable
一般来说,在 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 的灵活性,而不必担心时区和夏令时。
您可以映射 java.util.Calendar 而无需特殊映射。
它会给你同样的结果。