【发布时间】:2015-04-10 05:46:25
【问题描述】:
我正在编写一个简单的应用程序来了解 Java EE,我需要将一个实体保存到我的 MySQL DB 中,其中包含一个java.time.duration。
最好的存储方式是什么?
【问题讨论】:
-
你使用 JPA 吗?哪个提供商?
标签: java mysql jakarta-ee
我正在编写一个简单的应用程序来了解 Java EE,我需要将一个实体保存到我的 MySQL DB 中,其中包含一个java.time.duration。
最好的存储方式是什么?
【问题讨论】:
标签: java mysql jakarta-ee
由于 Hibernate 4.3 支持 JPA 2.1,您可以使用 AttributeConverter 类:
@Converter
public class DurationToStringConverter implements AttributeConverter<Duration, String>
{
@Override
public String convertToDatabaseColumn(Duration duration)
{
return duration == null ? null : duration.toString();
}
@Override
public Duration convertToEntityAttribute(String dbData)
{
return dbData == null ? null : Duration.parse(dbData);
}
}
@Entity
public class Ent {
@Column
@Convert(DurationToStringConverter.class)
Duration duration;
}
见:http://docs.oracle.com/javaee/7/api/javax/persistence/Convert.html
【讨论】:
很遗憾,JPA still does not support the types of the new java.time package
也就是说,您有几个方法(toString 和parse)可以通过转换为字符串来为您提供方法; v.g.
@Transient
private Duration myDuration;
@Column(name="DURATION")
String myDurationString;
@PostLoad
public void init() {
this.myDuration = this.myDurationString == null ? null : Duration.parse(this.myDurationString);
};
public Duration getMyDuration() {
return this.myDuration;
}
public void setMyDuration(Duration _myDuration) {
this.myDurationString = _myDuration == null ? null : _myDuration.toString();
}
请记住,您不应该为myDurationString 包含getter 和getter。
如果您更愿意以毫秒为单位,您可以选择使用toMillis() 和ofMillis()。
【讨论】:
javax.persistence.AttributeConverter 中使用相同的逻辑
整数类型,长度根据需要。使用静态单位(即毫秒)或将单位存储在单独的字段中 - 如果您使用的是 JPA2,它具有枚举到字符串的映射。
如果您使用的是 JPA 2.1,您甚至可以使用 @Converter,从而无需在实体中使用转换代码。
【讨论】: