我在一个javax.xml.datatype.Duration类型的类中有一个属性字段。它基本上表示一个时间跨度(例如4小时34分钟)。JPA告诉我这是一个无效的类型,这并不让我感到震惊。我可以实现自己的Duration类,但我不知道如何让JPA“接受”它作为一种数据类型。
javax.xml.datatype.Duration
lztngnrs1#
我可以实现自己的Duration类,但我不知道如何让JPA“接受”它作为一种数据类型。JPA不支持自定义类型,所以如果你想这样做,你必须使用提供程序的JPA扩展。例如,Hibernate允许定义你用@Type声明的自定义值类型。显然,这会损害提供程序之间的可移植性,这可能是一个问题。如果不是,那么你知道这是可行的。对于标准的JPA,传统的方法是添加另一个getter/setter对,它适应有问题的属性并在访问时执行转换。我会使用Long来存储持续时间:
@Type
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)); } }
字符串
dsf9zpds2#
您可以将Duration类中的确切字段镜像到您自己的自定义类中,但这可能有点过头了......我假设您不需要这种持续时间灵活性/粒度。因此,选择您想要的字段,将它们添加到您的类中,用@Embeddable注解标记类,并将适当的JPA注解添加到字段中(我假设是简单的整数)。在存储持续时间的实体中,将@Embedded注解添加到字段或getter中,无论您通常使用哪一个。从这里您可以使用@ AttributeObject进一步调整列定义。
2wnc66cl3#
您可以尝试joda-time hibernate。参考可以持久化的可用类型。然后您可以按以下方式使用joda Duration:
@Type(type="org.joda.time.contrib.hibernate.PersistentDuration") private Duration startDateTime;
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到一个数字列,该列存储以分钟为单位的持续时间。
4条答案
按热度按时间lztngnrs1#
我可以实现自己的Duration类,但我不知道如何让JPA“接受”它作为一种数据类型。
JPA不支持自定义类型,所以如果你想这样做,你必须使用提供程序的JPA扩展。例如,Hibernate允许定义你用
@Type
声明的自定义值类型。显然,这会损害提供程序之间的可移植性,这可能是一个问题。如果不是,那么你知道这是可行的。对于标准的JPA,传统的方法是添加另一个getter/setter对,它适应有问题的属性并在访问时执行转换。我会使用
Long
来存储持续时间:字符串
dsf9zpds2#
您可以将Duration类中的确切字段镜像到您自己的自定义类中,但这可能有点过头了......我假设您不需要这种持续时间灵活性/粒度。
因此,选择您想要的字段,将它们添加到您的类中,用@Embeddable注解标记类,并将适当的JPA注解添加到字段中(我假设是简单的整数)。
在存储持续时间的实体中,将@Embedded注解添加到字段或getter中,无论您通常使用哪一个。从这里您可以使用@ AttributeObject进一步调整列定义。
2wnc66cl3#
您可以尝试joda-time hibernate。参考可以持久化的可用类型。然后您可以按以下方式使用joda Duration:
字符串
wgx48brx4#
在我的例子中,我有一个java.time.Duation字段,它是通过javax.persistence.AttributeConverter转换的:
字符串
Duration ObjectMap到一个数字列,该列存储以分钟为单位的持续时间。