我在自己的expiryLimit实体中有一个字段-Item,我考虑过要使用joda-time Period,这是在此处使用的合适类型。

只是说明一下-expiryLimit是年,月,日或特定项目将在其后到期的任何持续时间的数目,通过这些数目,我可以计算出给定expiryDateItem的确切deliveryDate

现在,我面临的问题是找到将这种类型映射到JPA的适当方法。

有没有可用的API或第三方库提供一些注释来做到这一点?另外,我还使用了Eclipse Link @Converter批注来将DateTime与MySQL TimeStamp映射。因此,我还需要对Period做同样的事情。如果是,那么我应该将其转换为哪种类型。要varchar吗?还是Long?或其他适合表示Period的类型。

最佳答案

好的,最后我仅通过使用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;
    }
}

10-05 23:09
查看更多