2017-06-21 57 views
0

鉴于此实体,我需要发布类型合同的新对象。 I http://www.springframework.org/tags/form标记形式/ sf。我也得到了jquery datapicker。我得到的问题是datapicker返回一个String not Date对象。它如何被解析?我认为唯一的解决方案是在@Controller类中将date从datepicker作为@RequestParam获取,并将其解析为java.util.Date对象。从datapicker获取数据到实体

@Entity 
@Table(name = "contract") 
public class Contracts { 
    @Id 
    @Column(name = "contract_id") 
    private int contractId; 
    @Column(name = "date_added") 
    private Date creationDate; 
    @Column(name = "date_start") 
    private Date startDate; 
    @Column(name = "date_end") 
    private Date finishDate; 
    @NotNull 
    @Column(name = "payment_amount") 
    private Integer paymentAmount; 
    @Column(name = "payment_type") 
    @Enumerated(EnumType.STRING) 
    private PaymentType paymentType; 
    private boolean valid; 
    @ManyToOne 
    @JoinColumn(name = "system_id") 
    private Systems system; 

这是我的控制器类的'POST'部分。

@RequestMapping(value = "/createcontract", method = RequestMethod.POST) 
public String createContract(@ModelAttribute("contract") @Valid final Contracts contract, BindingResult results, 
     @RequestParam("system-id") int systemId) { 
    if(results.hasErrors()) 
     return "newcontract"; 
    return "redirect:contracts"; 

另一个问题(因为我标记的PostgreSQL)是是否是“全部正确”的存储java.util.Data对象的PostgreSQL刚刚日期或也许我应该把它存储为“时间戳和时区”?

回答

0

jQuery UI的DatePicker的给Date对象

该插件可以让你获得使用getDate method Date对象。

Here is a Plunker有一个工作示例。

$(function() { 
    $('#datePicker').datepicker(); 
    $('#datePicker').on('change',() => { 
     let date = $('#datePicker').datepicker('getDate'); 
     alert(`Date ${date} is ${date instanceof Date ? 'a Date object' : 'not a Date object'}`); 
    }); 
}); 

日期类型 - PostgreSQL中

JPA到PostgreSQL映射

  1. 使用timestamp with time zone通常是最好的,让您的日期作为数据库UTC。这可以提供最大的灵活性,因为您可以在任何您想要的区域中表示日期。这意味着使用timestamp with time zone作为将存储为UTC的类型。这意味着您的日期时间在存储之前会添加区域偏移量以获取UTC。

  2. 设置时区到你的JVM的UTC或JPA提供

重要的是,所有的日期表示为UTC,而不是在一个特定的时间段。当这些通过电线发送到您的数据库时,会话需要有UTC时区。

这意味着时区需要是JVM或JPA提供程序的UTC(例如:Hibernate)。

正如所解释的in this blog您可以通过设置UTC:

JVM:java -Duser.timezone=UTC -jar blabla.jar

或者通过

JVM:TimeZone.setDefault(TimeZone.getTimeZone("Etc/UTC"));

或者通过

休眠:(application.properties)spring.jpa.properties.hibernate.jdbc.time_zone = UTC

检查哪个版本适合您。

  • 坚持Date
  • 因此你的领域可以表示为:

    @Column(name = "date_added", columnDefinition = "TIMESTAMP WITH TIMEZONE") 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date creationDate; 
    

    而你需要确保Date对象表示的日期时间以UTC表示。

  • 有用的映射
  • 可以在PostgreSQL的作为存储你的日期对象:

    • timestamp有或没​​有时区
    • time有或没​​有时区
    • date

    使用适用于您的Date领域的JPA批注@Temporal您可以指定对象如何被映射:

    • @Temporal(TIMESTAMP)为timestamp
    • @Temporal(DATE)date
    • @Temporal(TIME)time

    另外指定你的列是timestamp with timezone可以是stat使用注释@Column(columnDefinition = "TIMESTAMP WITH TIMEZONE")进行编辑。

    0

    import java.sql.Timestamp; 或 import java.sql.Date; 添加此导入ur pojo。