我需要存储delta时间,我在数据库中以格式:yyyy-MM-ddTHH:mm
接收。为此,我使用Joda-Time Period类。现在,我已经完成了从Period
到DB列的映射。我正在使用Hibernate Framework,并找到了Jadira UserType
project。听起来不错。这就是我现在所拥有的:
@Entity
class SomeEntity {
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentPeriodAsString")
private Period deltaTime;
}
但问题是,它有一种特定格式 - PnYnMnDTnHnMnS
,因为我猜它使用AbstractPeriod#toString()
方法。
如何更改它以使用通过我自己的PeriodFormatter的一个参数AbstractPeriod#toString(PeriodFormatter)
,以yyyy-MM-ddTHH:mm
格式存储它?
之前我在使用JPA和EclipseLink以及I solved it using EclipseLink Converter时遇到过这个问题,但还没有找到解决方法。有什么输入吗?
答案 0 :(得分:3)
您可以实现自己的类型。为此,您可以通过扩展PersistentPeriodAsString
并提供自己的AbstractSingleColumnUserType
镜像ColumnMapper
的定义:
public class PersistentPeriodAsFormattedString extends
AbstractSingleColumnUserType<Period, String,
StringColumnPeriodFormatterMapper> {
}
public class StringColumnPeriodFormatterMapper extends
AbstractStringColumnMapper<Period> {
private static final PeriodFormatter FORMATTER = ...;
@Override
public Period fromNonNullValue(String s) {
return FORMATTER.parsePeriod(s);
}
@Override
public String toNonNullValue(Period value) {
return value.toString(FORMATTER);
}
}
请注意,对于任何UserType
,以下内容必须为真(Hibernate Javadoc):
Implementors must be immutable and must declare a public default constructor.
同样,ColumnMapper
使用的AbstractSingleColumnUserType
必须将公共默认构造函数定义为an instance is instantiated by reflections:
columnMapper = (C) TypeHelper
.getTypeArguments(AbstractSingleColumnUserType.class, getClass()).get(2)
.newInstance();