Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Spring和Hibernate中使用JodaTime?_Java_Hibernate_Spring_Date_Jodatime - Fatal编程技术网

Java 如何在Spring和Hibernate中使用JodaTime?

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,所

所以我在我的Spring应用程序中遇到了一个问题。用户可以使用日期选择器工具输入日期,这些日期使用Hibernate存储在Mysql数据库中。该表使用一个日期字段来存储它们,因此不节省时间。问题是服务器设置为GMT,我们的用户是EST或GMT-5。因此,日期被正确地存储在数据库中,但当它显示在前端时,它总是显示以前的日期。这让我很恼火,因为我没有节省时间,但很明显,这仍然会影响事情。总之,2001年10月12日将作为2011年9月12日出现在前端。我已经调查过了,我不允许将服务器更改为EST,所以我现在正在考虑使用Jodatime解决这个问题(除非有人认为我正在做其他事情导致这个问题),或者更简单的解决方案

我的问题是,我找不到任何关于如何在Spring中使用Jodatime的好信息。目前,我正在尝试将一个对象从使用java的
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一起使用?