2014-07-14 1 views
3

Je dois stocker l'heure delta que je reçois au format: yyyy-MM-ddTHH:mm dans la base de données. Pour cela j'utilise Joda-TimePeriod classe. Maintenant, je dois faire le mappage de Period à la colonne DB. J'utilise Hibernate Framework, et j'ai découvert Jadira UserType project. Ça m'a l'air bien. Voici ce que j'ai jusqu'à présent:Période Jodatime à Jadira Usertype PersistentPeriodAsString. Donner un format personnalisé?

@Entity 
class SomeEntity { 
    @Type(type="org.jadira.usertype.dateandtime.joda.PersistentPeriodAsString") 
    private Period deltaTime; 
} 

Mais la question est, il a un format spécifique - PnYnMnDTnHnMnS, comme je suppose qu'il utilise la méthode AbstractPeriod#toString().

Comment puis-je le modifier pour utiliser le seul argument AbstractPeriod#toString(PeriodFormatter) en passant mon propre PeriodFormatter, pour le stocker au format ?

Plus tôt, j'ai fait face à ce problème avec JPA et EclipseLink, et I solved it using EclipseLink Converter, mais je n'ai pas encore trouvé de solution à ce problème. Toutes les entrées?

Répondre

3

Vous pouvez implémenter votre propre type. Pour ce faire, vous pouvez mettre en miroir la définition de PersistentPeriodAsString en étendant AbstractSingleColumnUserType et en fournissant votre propre 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); 
    } 
} 

Notez que pour toute UserType les conditions suivantes doivent être (Hibernate Javadoc):

Implementors must be immutable and must declare a public default constructor. 

De même, le ColumnMapper utilisé par AbstractSingleColumnUserType doit définir un constructeur public par défaut comme an instance is instantiated by reflections:

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

Bang sur !! C'est le chemin à parcourir. Merci :) –

Questions connexes