我试图保持我的应用程序用户以ISO8601格式输入的日期,所以我构建了一个自定义的Hibernate映射类,如下所示:
public class UTCTimestampType extends org.hibernate.type.TimestampType{
@Override
public Object get(ResultSet rs, String name) throws SQLException {
return rs.getTimestamp(name, createUTCCalendar());
}
private static Calendar createUTCCalendar() {
final Calendar c = Calendar.getInstance();
c.setTimeZone(new SimpleTimeZone(0, "UTC"));
return c;
}
@Override
public void set(PreparedStatement st, Date value, int index)
throws SQLException{
Timestamp ts;
if (value instanceof Timestamp) {
ts = (Timestamp) value;
} else {
ts = new Timestamp(((java.util.Date)value).getTime());
}
st.setTimestamp(index, ts, createUTCCalendar());
}
}
然后在我的实体类中,我按如下方式定义了日期字段:
@Type(type="com.domainname.empmgmt.common.util.UTCTimestampType")
@Column(name="DOB",nullable=false,unique=false)
private DateTime dob;
当我尝试使用以下代码从控制器保存日期时:
DateTimeZone timeZone = DateTimeZone.forID( "Asia/Hong_Kong" );
DateTimeFormatter formatter = DateTimeFormat.forPattern( "MM/dd/yyyy" ).withZone( timeZone );
String input = "05/05/2013"; //For testing...
DateTime dateTime = formatter.parseDateTime( input );
employee.setDob(dateTime);
我收到以下错误:
HTTP状态500 - 请求处理失败;嵌套异常是 java.lang.ClassCastException:org.joda.time.DateTime无法强制转换为 java.util.Date
我不确定为什么自定义映射不起作用,因为错误显示Hibernate仍然将该字段视为java.util.Date而不是DateTime,所以有人可以告诉我我在这里做错了什么以及如何解决这个问题?
由于
答案 0 :(得分:0)
您的自定义类型set()方法需要将Date作为值保留:
public void set(PreparedStatement st, Date value, int index)
但您的字段属于DateTime
类型,不会延长日期。显然,这是行不通的。