Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用JPA映射持续时间类型_Jpa_Time_Types_Annotations_Duration - Fatal编程技术网

如何使用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对象。