我正在编写一个简单的应用程序来了解Java EE,我需要将实体保存到我的MySQL DB中,其中包含java.time.duration
。
存储它的最佳方法是什么?
答案 0 :(得分:4)
不幸的是,JPA still does not support the types of the new java.time
package
那就是说,你有几种方法(toString
和parse
)为你提供了转换为String的方法; 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()
。
答案 1 :(得分:4)
由于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
答案 2 :(得分:1)
整数类型,长度根据需要。要么使用静态单位(即毫秒),要么将单位存储在一个单独的字段中 - 如果你正在使用JPA2,它就会为此进行字符串映射。
如果你正在使用JPA 2.1,你甚至可以使用@Converter
,从而无需在你的实体中使用转换代码。