Roh*_*ain 5 java mysql jpa period jodatime
我有一个字段 - expiryLimit
在我的Item
实体中,我想到使用joda-time Period
,这将是一个适当的类型在这里使用.
只是解释- expiryLimit
是的数年,月,日,或任何时间之后,特定的项目将过期使用,我可以计算出准确expiryDate
的Item
给予deliveryDate
.
现在我面临的问题是找到一种合适的方法将这种类型映射到JPA
.
是否有任何可用的API或第三方库提供了一些注释来执行此操作?此外,我已经使用了Eclipse的链接 @Converter
注释映射DateTime
与MySQL的 TimeStamp
.那么,我是否也需要做同样的事情Period
.如果是,那么我应该将它转换为什么类型.到varchar
?或者Long
?或其他适合代表的类型Period
.
好的,最后我只使用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;
}
}
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)