使用Joda和Hibernate保持IS08601日期格式

时间:2014-02-02 11:32:51

标签: java hibernate jodatime

我试图保持我的应用程序用户以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,所以有人可以告诉我我在这里做错了什么以及如何解决这个问题?

由于

1 个答案:

答案 0 :(得分:0)

您的自定义类型set()方法需要将Date作为值保留:

public void set(PreparedStatement st, Date value, int index)

但您的字段属于DateTime类型,不会延长日期。显然,这是行不通的。