如何使用JPA映射持续时间类型

时间:2010-05-13 20:31:00

标签: jpa time types annotations duration

我在类javax.xml.datatype.Duration的类中有一个属性字段。它基本上代表了一个时间跨度(例如4小时34分钟)。

JPA告诉我这是一种无效的类型,这并不会让我感到震惊。

这是一个很好的解决方案吗?我可以实现自己的Duration类,但我不知道如何让JPA“接受”它作为数据类型。

3 个答案:

答案 0 :(得分:7)

  

这是一个很好的解决方案吗?我可以实现自己的Duration类,但我不知道如何让JPA“接受”它作为数据类型。

JPA不支持自定义类型,因此如果您想这样,则必须使用提供商提供的JPA扩展程序。例如,Hibernate允许定义您使用custom value types声明的@Type。显然,这会损害提供商之间的可移植性,这可能是一个问题。如果没有,那么你知道它是可行的。

使用标准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));
    }
}

答案 1 :(得分:1)

您可以将Duration类中的确切字段镜像到您自己的自定义类中,但这可能有点过分......我假设您不需要那种持续时间灵活性/粒度。

因此,选择您想要的字段,将它们添加到您的类中,使用@Embeddable注释标记该类,并将相应的JPA注释添加到字段中(我假设它将是简单的整数)。

在将存储持续时间的实体中,将@Embedded注释添加到字段或getter中,无论您通常使用哪个。从这里,您可以使用@AttributeOverride进一步调整列定义。

答案 2 :(得分:1)

您可以尝试joda-time hibernate。请参阅可以保留的available types。然后,您可以通过以下方式使用joda Duration

@Type(type="org.joda.time.contrib.hibernate.PersistentDuration")
private Duration startDateTime;