2011-12-15 71 views
8

所以我在我的Spring应用程序中遇到问题。用户可以使用日期选择工具输入日期,并使用Hibernate将它们存储在Mysql数据库中。该表使用日期字段来存储它们,所以它不会节省时间。问题是服务器设置为GMT,我们的用户是EST或GMT-5。所以日期正确地存储在数据库中,但是当它显示在前端时,它总是显示前一个日期。因为我没有节省时间,但显然它仍然影响着一些东西,这让我感到困扰。无论如何,所以12/12/2001将显示在12/09/2011前端。我已经研究过它,并且我不允许将服务器更改为EST,因此我现在正在考虑用Jodatime解决此问题(除非有人知道我正在执行其他操作来实现此目的)或者更简单的解决方案。如何在Spring和Hibernate中使用JodaTime?

我的问题是,我无法找到任何有关如何使用Spring的Jodatime的好信息。目前我只是试图改变一个对象,从使用java的Date到使用joda的LocalDate。无论我尝试什么,尽管我在尝试从数据库中提取日期对象并将其推入LocalDate对象时遇到“无效流头”和“无法反序列化”的错误。

有人可以提供一些指导我需要做什么来存储和检索,以便这个工作吗?

我使用Spring 3.1的注释和所有的好东西。我很高兴提供代码,但是因为我不确定该做什么,我没有任何我认为会有帮助的代码。从JSP到数据库,我可以真正使用一些帮助。我认为我不确定的主要问题是如何将它存储在服务器上,我认为这就是为什么我得到Hibernate错误。数据库正如我所提到的那样使用Date,所以不会存储时间。我如何将LocalDate转换为此?

下面是一些代码,如果有帮助:

域对象

@Entity 
public class Provision { 
    @Id @GeneratedValue 
    private Long id; 

    private LocalDate startDate; 

    //Getters and setters 
} 

我有一个DatePropertyEditor为JSP和Spring之间从文本转换为日期:

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> 

其余的代码都不处理或接触Date对象,其余的都是通过注释和注入来处理的,其他的不是。

+0

心灵向我们展示你的代码? – luastoned 2011-12-15 14:57:28

回答

7

我建议你使用Spring 3 Converter SPI而不是普通的PropertyEditors。

然后,只需编写自定义转换器:

final class StringToDateTime implements Converter<String, DateTime> { 
    private static final DateTimeFormatter FORMAT = // init here 

    public DateTime convert(String source) { 
     return FORMAT.parseDateTime(source); 
    } 

} 

但是,这仅仅是春天的一面。你仍然需要确保Hibernate知道JodaTime。看看这个Joda Time - Hibernate support项目。

+0

非常好的信息,非常感谢。 – cardician 2011-12-15 18:50:23

4

这个问题是不是新的,看看它的讨论,我把我的博客:http://blog.jadira.co.uk/blog/2010/5/1/javasqldate-types-and-the-offsetting-problem.html

我的项目(用户类型 - http://usertype.sourceforge.net/)解决了这个与它PersistentDateTime类。我建议你使用它来为你的实体提供一个usertype。

这一类的Javadoc描述如何进一步的调整,用于持续,随后再膨胀区域:http://usertype.sourceforge.net/apidocs/org/jadira/usertype/dateandtime/joda/PersistentDateTime.html

如果你使用Hibernate 4,你还可以使用自动注册的。有关如何使用此功能的详细信息,请参阅http://blog.jadira.co.uk/blog/2012/1/19/release-jadira-usertype-300cr1-with-support-for-joda-money-0.html

HTH

克里斯

+0

如何在Hibernate EntityManger中使用Usertype? – 2012-12-18 01:57:12

相关问题