Java 如何在Spring和Hibernate中使用JodaTime?
所以我在我的Spring应用程序中遇到了一个问题。用户可以使用日期选择器工具输入日期,这些日期使用Hibernate存储在Mysql数据库中。该表使用一个日期字段来存储它们,因此不节省时间。问题是服务器设置为GMT,我们的用户是EST或GMT-5。因此,日期被正确地存储在数据库中,但当它显示在前端时,它总是显示以前的日期。这让我很恼火,因为我没有节省时间,但很明显,这仍然会影响事情。总之,2001年10月12日将作为2011年9月12日出现在前端。我已经调查过了,我不允许将服务器更改为EST,所以我现在正在考虑使用Jodatime解决这个问题(除非有人认为我正在做其他事情导致这个问题),或者更简单的解决方案 我的问题是,我找不到任何关于如何在Spring中使用Jodatime的好信息。目前,我正在尝试将一个对象从使用java的Java 如何在Spring和Hibernate中使用JodaTime?,java,hibernate,spring,date,jodatime,Java,Hibernate,Spring,Date,Jodatime,所以我在我的Spring应用程序中遇到了一个问题。用户可以使用日期选择器工具输入日期,这些日期使用Hibernate存储在Mysql数据库中。该表使用一个日期字段来存储它们,因此不节省时间。问题是服务器设置为GMT,我们的用户是EST或GMT-5。因此,日期被正确地存储在数据库中,但当它显示在前端时,它总是显示以前的日期。这让我很恼火,因为我没有节省时间,但很明显,这仍然会影响事情。总之,2001年10月12日将作为2011年9月12日出现在前端。我已经调查过了,我不允许将服务器更改为EST,所
Date
更改为使用joda的LocalDate
。无论我尝试什么,当它试图从数据库中提取日期对象并将其推入LocalDate
对象时,我都会在“无效流头”和“无法反序列化”上出错
有没有人能为我提供一些指导,告诉我在存储和检索时需要做些什么,这样才能工作
我正在使用Spring3.1和注释以及所有这些好东西。我很乐意提供代码,但因为我不确定该怎么做,所以我没有任何我认为有用的代码。从JSP到数据库,再到数据库,我真的需要一些帮助。我想我不确定的主要问题是如何将其存储在服务器上,我想这就是为什么我会出现Hibernate错误的原因。数据库使用的是我提到的日期,所以没有存储时间。如何将LocalDate转换为此格式
下面是一些代码,如果有帮助的话:
域对象
@Entity
public class Provision {
@Id @GeneratedValue
private Long id;
private LocalDate startDate;
//Getters and setters
}
我有一个用于在JSP和Spring之间从文本转换为日期的DatePropertyEditor:
public class DatePropertyEditor extends PropertyEditorSupport {
@Override
public void setAsText(String value) {
try {
setValue(new SimpleDateFormat("yyyy-MM-dd").parse(value));
} catch (ParseException e) {
setValue(null);
}
}
@Override
public String getAsText() {
if(getValue() != null)
return new SimpleDateFormat("yyyy-MM-dd").format((Date) getValue());
else
return null;
}
}
下面是一些输入数据的JSP:
<td align="right">Start Date:</td>
<td><sf:input path="startDate" dojoType="dijit.form.DateTextBox" required="true" hasDownArrow="true"
onChange="dijit.byId('endDate').constraints.min = arguments[0];" constraints="{datePattern:'MMM d, y'}" />
</td>
开始日期:
代码的其余部分都不处理或涉及日期对象,其余部分都是通过注释和注入等方式处理的。我建议您使用属性编辑器,而不是常规的属性编辑器
然后只需编写一个自定义转换器:
final class StringToDateTime implements Converter<String, DateTime> {
private static final DateTimeFormatter FORMAT = // init here
public DateTime convert(String source) {
return FORMAT.parseDateTime(source);
}
}
final类StringToDateTime实现转换器{
私有静态最终DateTimeFormatter格式=//init here
公共日期时间转换(字符串源){
返回格式.parseDateTime(源);
}
}
但这只是春天的一面。你仍然需要确保Hibernate知道JodaTime。看看这个项目。这个问题不是新问题,看看我在博客上对它的讨论: 我的项目(Usertype-)通过其PersistentDateTime类解决了这个问题。我建议您使用它为您的实体提供一个用户类型 此类上的Javadoc描述了如何进一步调整用于持久化和随后重新膨胀的区域: 如果使用Hibernate4,还可以使用自动注册。有关如何使用此功能的详细信息,请参阅 嗯
Chris如何将Usertype与Hibernate EntityManger一起使用?