如何使用JPAMapDuration类型

pw9qyyiw  于 2023-11-18  发布在  其他
关注(0)|答案(4)|浏览(144)

我在一个javax.xml.datatype.Duration类型的类中有一个属性字段。它基本上表示一个时间跨度(例如4小时34分钟)。
JPA告诉我这是一个无效的类型,这并不让我感到震惊。
我可以实现自己的Duration类,但我不知道如何让JPA“接受”它作为一种数据类型。

lztngnrs

lztngnrs1#

我可以实现自己的Duration类,但我不知道如何让JPA“接受”它作为一种数据类型。
JPA不支持自定义类型,所以如果你想这样做,你必须使用提供程序的JPA扩展。例如,Hibernate允许定义你用@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));
    }
}

字符串

dsf9zpds

dsf9zpds2#

您可以将Duration类中的确切字段镜像到您自己的自定义类中,但这可能有点过头了......我假设您不需要这种持续时间灵活性/粒度。
因此,选择您想要的字段,将它们添加到您的类中,用@Embeddable注解标记类,并将适当的JPA注解添加到字段中(我假设是简单的整数)。
在存储持续时间的实体中,将@Embedded注解添加到字段或getter中,无论您通常使用哪一个。从这里您可以使用@ AttributeObject进一步调整列定义。

2wnc66cl

2wnc66cl3#

您可以尝试joda-time hibernate。参考可以持久化的可用类型。然后您可以按以下方式使用joda Duration

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

字符串

wgx48brx

wgx48brx4#

在我的例子中,我有一个java.time.Duation字段,它是通过javax.persistence.AttributeConverter转换的:

@Converter(autoApply = true)
public class DurationAttributeConverter implements AttributeConverter<Duration, Integer> {

  @Override
  public Integer convertToDatabaseColumn(Duration pX) {
    if (pX == null) {
      return null;
    } else {
      return (int) pX.toMinutes();
    }
  }

  @Override
  public Duration convertToEntityAttribute(Integer pY) {
    if (pY == null) {
      return null;
    } else {
      return Duration.ofMinutes(pY);
    }
  }
}

字符串
Duration ObjectMap到一个数字列,该列存储以分钟为单位的持续时间。

相关问题