如何使用JPA映射持续时间类型
我在一个类中有一个属性字段,类型为如何使用JPA映射持续时间类型,jpa,time,types,annotations,duration,Jpa,Time,Types,Annotations,Duration,我在一个类中有一个属性字段,类型为javax.xml.datatype.Duration。它基本上代表一个时间跨度(例如4小时34分钟) JPA告诉我这是一个无效的类型,这并不让我吃惊 这有什么好办法?我可以实现我自己的Duration类,但我不知道如何让JPA“接受”它作为数据类型。您可以将Duration类中的确切字段镜像到您自己的自定义类中,但这可能有些过分……我假设您不需要那种Duration灵活性/粒度 因此,选择所需的字段,将它们添加到类中,用@Embeddeble注释标记该类,并将
javax.xml.datatype.Duration
。它基本上代表一个时间跨度(例如4小时34分钟)
JPA告诉我这是一个无效的类型,这并不让我吃惊
这有什么好办法?我可以实现我自己的Duration类,但我不知道如何让JPA“接受”它作为数据类型。您可以将Duration类中的确切字段镜像到您自己的自定义类中,但这可能有些过分……我假设您不需要那种Duration灵活性/粒度 因此,选择所需的字段,将它们添加到类中,用@Embeddeble注释标记该类,并将适当的JPA注释添加到字段中(我假设这些字段将是简单的int) 在将存储持续时间的实体中,将@Embedded注释添加到字段或getter中,以您通常使用的为准。从这里,您可以使用@AttributeOverride进一步调整列定义 这有什么好办法?我可以实现自己的Duration类,但我不知道如何让JPA“接受”它作为数据类型 JPA不支持自定义类型,因此如果您想这样做,您必须使用提供商提供的JPA扩展。例如,Hibernate允许定义您声明的。显然,这将损害提供者之间的可移植性,这可能是一个令人担忧的问题。如果没有,那么你知道这是可行的 对于标准JPA,传统的方法是添加另一个getter/setter对,该对适应有问题的属性,并在访问时执行转换。我会使用
Long
来存储持续时间:
public MyEntity implements Serializable {
private Long id;
private javax.xml.datatype.Duration duration;
@Id
@GeneratedValue
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
@Transient
public Duration getDuration() {
return this.duration;
}
public void setDuration(Duration duration) {
this.duration = duration;
}
public Long getDurationAsJpaCompatibleType() {
return MyXmlUtil.convertDurationToLong(this.duration);
}
public void setDurationAsJpaCompatibleType(Long duration) {
setDuration(MyXmlUtil.convertLongToDuration(duration));
}
}
你可以试试。请参阅可以持久化的。然后,您可以通过以下方式使用:
@Type(type="org.joda.time.contrib.hibernate.PersistentDuration")
private Duration startDateTime;
你是说包装Duration类还是从头开始实现一个新的类?从头开始创建自己的类是最简单的。javax.xml.datatype.Duration类有更多的字段,您可能希望在DB表中以列的形式公开这些字段,因此创建一个具有所需时间粒度的自定义Duration对象。