2014-07-14 1 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() 방법을 사용 추측과 같이 여기에 지금까지있어거야.

AbstractPeriod#toString(PeriodFormatter)은 내 자신의 PeriodFormatter를 전달하여 yyyy-MM-ddTHH:mm 형식으로 저장하기 위해 어떻게 변경할 수 있습니까?

이전에 JPA 및 EclipseLink 및 I solved it using EclipseLink Converter에이 문제가 발생했지만 아직 해결 방법을 찾지 못했습니다. 어떤 입력?

답변

3

자신 만의 유형을 구현할 수 있습니다. 이를 위해, 당신은 ColumnMapper을 자신의 AbstractSingleColumnUserType을 확장하고 제공함으로써 PersistentPeriodAsString의 정의를 반영 할 수있는 UserType에 대해 다음 조건이 충족되어야합니다 것을

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); 
    } 
} 

주 (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

강타! 이것이 갈 길입니다. 감사 :) –

관련 문제