Jodatime Period to Jadira Usertype PersistentPeriodAsString。提供自定义格式?

时间:2014-07-14 06:26:10

标签: java hibernate jodatime period usertype

我需要存储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时遇到过这个问题,但还没有找到解决方法。有什么输入吗?

1 个答案:

答案 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();