JPA 1.0是否支持GregorianCalendar
的映射?我在JPA 1.0的映射文件规范中没有找到任何关于GregorianCalendar
的内容。 JPA 2.0怎么样?
答案 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.Date
,java.sql.Time
,java.sql.Timestamp
,byte[]
,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而不需要特殊映射。
它会给你相同的结果。