使用Eclipse Link在JPA中映射Joda Time"Period"的注释

Roh*_*ain 5 java mysql jpa period jodatime

我有一个字段 - expiryLimit在我的Item实体中,我想到使用joda-time Period,这将是一个适当的类型在这里使用.

只是解释- expiryLimit是的数,,,或任何时间之后,特定的项目将过期使用,我可以计算出准确expiryDateItem给予deliveryDate.

现在我面临的问题是找到一种合适的方法将这种类型映射到JPA.

是否有任何可用的API第三方库提供了一些注释来执行此操作?此外,我已经使用了Eclipse的链接 @Converter注释映射DateTimeMySQL的 TimeStamp.那么,我是否也需要做同样的事情Period.如果是,那么我应该将它转换为什么类型.到varchar?或者Long?或其他适合代表的类型Period.

Roh*_*ain 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

周期转换器.类:-

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;
    }
}
Run Code Online (Sandbox Code Playgroud)