来映射持续时间类型我有一个javax.xml.datatype.Duration
类型的属性字段。它基本上代表了时间跨度(例如4小时和34分钟)。如何使用JPA
JPA告诉我这是一种无效的类型,它不会让我感到震惊。
这是一个很好的解决方案吗?我可以实现我自己的Duration类,但我不知道如何让JPA将它“接受”为数据类型。
来映射持续时间类型我有一个javax.xml.datatype.Duration
类型的属性字段。它基本上代表了时间跨度(例如4小时和34分钟)。如何使用JPA
JPA告诉我这是一种无效的类型,它不会让我感到震惊。
这是一个很好的解决方案吗?我可以实现我自己的Duration类,但我不知道如何让JPA将它“接受”为数据类型。
这是一个很好的解决方案吗?我可以实现我自己的Duration类,但我不知道如何让JPA将它“接受”为数据类型。
JPA不支持自定义类型,所以如果你想这样做,你将不得不从你的提供者使用JPA扩展。例如,Hibernate允许您定义您使用@Type
声明的custom value types。显然,这会损害可能成为问题的提供者之间的可移植性。如果没有,那么你知道这是可行的。
对于标准的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));
}
}
您可以将Duration类中的确切字段映射到您自己的自定义类中,但这可能会矫枉过正......我假设您不需要这种持续时间灵活性/粒度。所以选择你想要的字段,将它们添加到你的类,用@Embeddable注释标记类,并添加适当的JPA注释到字段(我假设将是简单的整数)。
在您的存储持续时间的实体中,将@Embedded注释添加到字段或getter中,无论您通常使用哪个。从这里你可以用@AttributeOverride进一步调整列定义。
你可以尝试joda-time hibernate。请参阅可持续的available types。然后,您可以通过以下方式使用joda Duration:
@Type(type="org.joda.time.contrib.hibernate.PersistentDuration")
private Duration startDateTime;
你是说包Duration类或从头开始实现一个新的? – HDave 2010-05-14 01:39:44
从头创建自己将是最简单的。 javax.xml.datatype.Duration类具有更多字段,因此您可能希望将其公开为数据库表中的列,因此只需要您需要的时间粒度即可创建自定义Duration对象。 – Jeff 2010-05-14 13:57:31