2014-07-14 27 views
3

我需要在數據庫中存儲格式爲yyyy-MM-ddTHH:mm的增量時間。爲此我使用Joda-TimePeriod類。現在,我必須執行從Period到DB列的映射。我正在使用Hibernate Framework,並發現了Jadira UserType project。聽起來不錯。下面是我得到了什麼至今:Jodatime使用期限Jadira Usertype PersistentPeriodAsString。給定製格式?

@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的這個問題,但還沒有找到解決這個問題的方法。任何投入?

回答

3

你可以實現你自己的類型。要做到這一點,你可以通過擴展AbstractSingleColumnUserType,並提供自己的ColumnMapper鏡子PersistentPeriodAsString定義:

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. 

同樣,由AbstractSingleColumnUserType使用的ColumnMapper必須定義公共默認構造函數爲an instance is instantiated by reflections

columnMapper = (C) TypeHelper 
    .getTypeArguments(AbstractSingleColumnUserType.class, getClass()).get(2) 
    .newInstance(); 
+0

砰!這是要走的路。謝謝 :) –