2011-12-15 72 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

相關問題