2011-12-15 30 views
8

Vì vậy, tôi gặp phải sự cố trong ứng dụng Spring của mình. Người dùng có thể nhập ngày bằng cách sử dụng công cụ chọn ngày và chúng được lưu trữ trong cơ sở dữ liệu Mysql bằng Hibernate. Bảng sử dụng trường Ngày để lưu trữ chúng để nó không tiết kiệm thời gian. Vấn đề là máy chủ được đặt thành GMT và người dùng của chúng tôi là EST hoặc GMT-5. Vì vậy, ngày được lưu trữ chính xác trong cơ sở dữ liệu, nhưng sau đó khi nó được hiển thị trên giao diện người dùng, nó luôn hiển thị ngày trước đó. Làm phiền tôi vì tôi không tiết kiệm thời gian nhưng rõ ràng nó vẫn ảnh hưởng đến mọi thứ. Dù sao, do đó, 12/10/2001 sẽ hiển thị trên giao diện người dùng là 12/09/2011. Tôi đã xem xét nó và tôi không được phép thay đổi máy chủ thành EST nên bây giờ tôi đang tìm cách giải quyết vấn đề này với Jodatime (trừ khi ai đó có ý tưởng rằng tôi đang làm điều gì khác để gây ra điều này) hoặc một giải pháp dễ dàng hơn .Làm thế nào để sử dụng JodaTime với Spring và Hibernate?

Vấn đề của tôi là tôi không thể tìm thấy bất kỳ thông tin tốt về cách sử dụng Jodatime với Spring. Hiện tại tôi chỉ đang cố thay đổi một đối tượng từ việc sử dụng số Date của java để sử dụng số LocalDate của joda. Không có vấn đề gì tôi thử mặc dù tôi nhận được lỗi trên "tiêu đề luồng không hợp lệ" và "không thể deserialize" khi nó cố gắng kéo đối tượng ngày từ cơ sở dữ liệu và xô nó vào đối tượng LocalDate.

Ai đó có thể cung cấp cho tôi một số hướng dẫn về những gì tôi cần làm cho cả việc lưu trữ và truy xuất để công trình này hoạt động?

Tôi đang sử dụng Spring 3.1 với chú thích và tất cả những thứ tuyệt vời đó. Tôi rất vui được cung cấp mã nhưng vì tôi không chắc chắn nên làm gì để tôi không thực sự có bất kỳ mã nào mà tôi cho rằng sẽ hữu ích. Tôi thực sự có thể sử dụng một số trợ giúp về toàn bộ điều từ JSP đến cơ sở dữ liệu và ngược lại. Tôi nghĩ rằng điều chính tôi không chắc chắn là làm thế nào để lưu trữ này trên máy chủ và tôi nghĩ rằng đó là lý do tại sao tôi nhận được lỗi Hibernate. Cơ sở dữ liệu đang sử dụng Date như tôi đã đề cập, vì vậy không lưu trữ thời gian. Làm thế nào để chuyển đổi một LocalDate thành điều này?

Dưới đây là một số mã nếu nó giúp:

Object miền

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

    private LocalDate startDate; 

    //Getters and setters 
} 

Tôi có một DatePropertyEditor để chuyển đổi từ văn bản đến ngày giữa JSP và mùa xuân:

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; 
} 

} 

Và đây là một số JSP nơi dữ liệu được nhập:

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

Không có phần còn lại của mã giao dịch hoặc chạm vào đối tượng Ngày, tất cả phần còn lại được xử lý thông qua chú thích và cách tiêm và những gì không.

+0

tâm cho chúng ta thấy mã của bạn? – luastoned

Trả lời

7

Tôi khuyên bạn nên sử dụng Spring 3 Converter SPI thay vì PropertyEditors thông thường.

Sau đó chỉ cần viết một bộ chuyển đổi tùy chỉnh:

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

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

} 

Nhưng đó là chỉ phía mùa xuân. Bạn vẫn phải chắc chắn rằng Hibernate biết về JodaTime. Hãy xem dự án Joda Time - Hibernate support cho điều đó.

+0

Thông tin rất tốt, cảm ơn bạn rất nhiều. – cardician

4

Vấn đề này không phải là mới, hãy nhìn vào các cuộc thảo luận về nó mà tôi đặt trên blog của tôi: http://blog.jadira.co.uk/blog/2010/5/1/javasqldate-types-and-the-offsetting-problem.html

Dự án của tôi (loại - http://usertype.sourceforge.net/) giải quyết này với lớp PersistentDateTime của nó. Tôi khuyên bạn nên sử dụng điều này để cung cấp loại người dùng cho thực thể của bạn.

Các Javadoc trên lớp này mô tả làm thế nào bạn có thể tiếp tục tinh chỉnh vùng được sử dụng cho sự bền bỉ và sau đó tái lạm phát: http://usertype.sourceforge.net/apidocs/org/jadira/usertype/dateandtime/joda/PersistentDateTime.html

Nếu bạn sử dụng Hibernate 4 bạn cũng có thể sử dụng ký tự động. Để biết chi tiết về cách sử dụng tính năng này, xem http://blog.jadira.co.uk/blog/2012/1/19/release-jadira-usertype-300cr1-with-support-for-joda-money-0.html

HTH

Chris

+0

Làm cách nào để sử dụng Usertype với Hibernate EntityManger? –

Các vấn đề liên quan