我在我的expiryLimit
实体中有一个字段Item
,其中我想使用 joda-time Period
这是一个合适的类型在这里使用
只是为了解释 - expiryLimit
是年,月,天的数量,或者特定时间之后的任何持续时间项将过期并使用,我可以计算expiryDate
给定Item
的确切deliveryDate
。
现在我遇到的问题是找到一种将此类型映射到JPA
的合适方法。
是否有可用的 API 或第三方库提供了一些注释?我还使用了 Eclipse Link @Converter
注释来将DateTime
映射到 MySQL TimeStamp
。那么,我是否也需要对Period
做同样的事情。如果是,那么我应该将它转换为什么类型。到varchar
?还是Long
?或其他适合表示Period
的其他类型。
答案 0 :(得分:4)
好的,最后我只使用 EclipseLink @Converter
解决了这个问题。这就是我做到的。我也欢迎任何评论: -
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;
}
}
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;
}
}