5

私はフィールドを持っています -expiryLimit私のItemエンティティには、ここで使用するのに適切なタイプであるjoda-timeを使用することを考えました。 Period

説明するだけで、特定のアイテムの有効期限が切れるまでの、または任意の期間expiryLimitの数であり、これを使用して、特定の aの正確な値を計算できます。expiryDateItemdeliveryDate

今私が直面している問題は、この型を にマップする適切な方法を見つけることですJPA

それを行うための注釈を提供する利用可能なAPIまたはサードパーティ ライブラリはありますか? また、Eclipse Linkアノテーションを使用して MySQL@ConverterにマップDateTimeしました。それで、私も同じことをする必要がありますか?はいの場合、どのタイプに変換する必要がありますか。に? または?または を表すのに適したその他の型。 TimeStampPeriodvarcharLongPeriod

4

1 に答える 1

4

最後に、 EclipseLink @Converterのみを使用して問題を解決しました。これが私がやった方法です。この方法に関するコメントも歓迎します:-

ItemMaster エンティティ: -

public class ItemMaster {
    @Converter(
        name="periodConverter",
        converterClass = com.joda.converter.PeriodConverter.class
    )
    @Convert("periodConverter")
    @Column(name = "expiry_limit", length = 2000)
    private Period expiryLimit;

    /** Constructors **/


    public Period getExpiryLimit() {
        return expiryLimit;
    }

    public void setExpiryLimit(Period expiryLimit) {
        this.expiryLimit = expiryLimit;
    }
}

PeriodConverter.class: -

public class PeriodConverter implements Converter {

    private Logger log;
    private static final long serialVersionUID = 1L;

    @Override
    public Object convertDataValueToObjectValue(Object str, Session session) {
        if (str == null) {
            log.info("convertDataValueToObjectValue returning null");
            return null;
        }
        return new Period(str);

    }

    @Override
    public Object convertObjectValueToDataValue(Object period, Session session) {
        /** str format should be: - `PyYmMwWdDThHmMsS` **/
        if (period == null) {
            log.info("convertObjectValueToDataValue returning null");
            return null;
        }
        return period.toString();
    }

    @Override
    public void initialize(DatabaseMapping mapping, Session session) {
        log = Logger.getLogger("com.joda.converter.PeriodConverter");
        ((AbstractDirectMapping) mapping).setFieldType(java.sql.Types.VARCHAR);
    }

    @Override
    public boolean isMutable() {
        return true;
    }
}
于 2013-01-08T11:43:15.197 に答える