我在自己的expiryLimit
实体中有一个字段-Item
,我考虑过要使用joda-time Period
,这是在此处使用的合适类型。
只是说明一下-expiryLimit
是年,月,日或特定项目将在其后到期的任何持续时间的数目,通过这些数目,我可以计算出给定expiryDate
的Item
的确切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;
}
}