从datapicker获取数据到实体

时间:2017-06-21 17:47:37

标签: java spring postgresql datapicker

鉴于此实体,我需要发布类型为Contracts的新对象。一世 http://www.springframework.org/tags/form代码表单/ sf。我也有jquery datapicker。我遇到的问题是datapicker返回String而不是Date对象。怎么解析?我认为唯一可行的解​​决方案是在@Controller类中将datepicker中的日期作为@RequestParam获取,并将其解析为java.util.Date对象。

@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'我的Controller类的一部分。

@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)是否是“好吧”#39;将postgresql中的java.util.Data对象存储为日期,或者我应该将其存储为时区'时间戳'?

2 个答案:

答案 0 :(得分: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'}`);
  });
});

日期类型 - JPA到PostgreSQL映射

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

    1. 将时区设置为JVM或JPA提供程序的UTC
    2. 重要的是,所有日期都表示为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"));

      或者

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

      检查哪个版本适合您。

      1. 坚持Date字段
      2. 因此,您的字段可以表示为:

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

        您需要确保Date对象代表UTC的日期时间。

        1. 有用的映射
        2. 您可以将Date对象存储在PostgreSQL中:

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

          使用在Date字段上应用的JPA批注@Temporal,您可以指定对象的映射方式:

          • @Temporal(TIMESTAMP)到时间戳
          • @Temporal(DATE)date
          • @Temporal(TIME)time

          还可以使用注释timestamp with timezone来声明您的列为@Column(columnDefinition = "TIMESTAMP WITH TIMEZONE")

答案 1 :(得分:0)

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