Spring + Hibernate + MS SQL服务器 - UTC时区

时间:2016-08-08 08:13:35

标签: sql-server spring hibernate datetime timezone

我用Spring 4.2.5 + Hibernate 5.1.0开发了简单的应用程序 - 数据库系统是MS SQL Server 2014。

从几天开始,我在数据库中正确处理正确的存储时间+时区。

我需要履行的要求是:

  1. 以UTC时区保存所有日期。
  2. 将时区存储在数据库列值中。
  3. 为了实现它,我创建了名为MyComment的模型:

    @Entity
    @Table(name = "MY_COMMENT")
    @EntityListeners(value = { MyCommentListener.class })
    @Audited
    public class MyComment implements Serializable {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "ID")
        private Long id;
    
        @Column(name = "DATE_", nullable = false)
        private Timestamp date;
    
        ...
    }
    

    为了在UTC时区强制保存日期,我使用了Jadira框架:

        hibProperties.put("jadira.usertype.autoRegisterUserTypes", true);
        hibProperties.put("jadira.usertype.javaZone", "UTC");
        hibProperties.put("jadira.usertype.databaseZone", "UTC");
    

    然而,在MyComment对象的每次创建/更新操作期间,MyCommentListener从我的本地时区(而不是UTC日期!)获取日期:

    public class MyCommentListener {
    
        @PreUpdate
        @PrePersist
        public void setLastUpdate(MyComment myComment) {
            myComment.setDate(new Timestamp(System.currentTimeMillis()));
        }
    

    }

    您知道我该如何解决这个问题吗?

    1. 我应该在模型中使用其他日期类型吗?与时间戳不同?
    2. MS SQL Server数据库中的DATE_列应该是哪种类型?
    3. 我将不胜感激任何帮助。谢谢。

2 个答案:

答案 0 :(得分:1)

AFAIK,问题在于听众。在侦听器中替换以下代码并验证。根据需要更改日期格式。

    @PreUpdate
    @PrePersist
    public void setLastUpdate(MyComment myComment) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
        dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
        myComment.setDate(dateFormat.getCalendar().getTime());
    }

答案 1 :(得分:0)

对我来说很奇怪,Spring中没有设置默认TimeZone的属性 - 至少我不知道它。

经过一些谷歌搜索后,我发现Spring中设置时区的最佳位置是WebApplicationInitializer,所以我准备了以下代码:

public class MyWebApplicationInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(final ServletContext servletContext) throws ServletException {
        setupTimeZone();
    }

    private void setupTimeZone() {
        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    }
}