java - AuditingEntityListener 的 Spring JPA Hibernate CET 时区

标签 java spring spring-boot jdbc spring-data-jpa

我没有成功为我的 JPA 应用程序设置 CET 时区,该应用程序使用 AuditingEntityListener 来增加创建/上次修改日期。

我已经尝试过的事情:

在我的 application.properties(两种组合)中:

spring.jpa.properties.hibernate.jdbc.time_zone=UTC+1
spring.jpa.properties.hibernate.jdbc.time_zone=CET

将时区添加到我的 JDBC 连接(两种组合)

spring.datasource.url=jdbc:mysql://host:3306/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC+1
spring.datasource.url=jdbc:mysql://host:3306/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=CET

添加了一个postconstruct(应用层)

@PostConstruct
void started() {
    TimeZone.setDefault(TimeZone.getTimeZone("UTC+1"));
}

还尝试使用以下方法在数据库级别设置时区:

SET time_zone='+01:00';

无论如何都没有成功,我是不是错过了什么?

按如下方式使用@createdDate:

编辑

@Data
@Builder
@Entity
@EntityListeners(AuditingEntityListener.class)
@NoArgsConstructor
@AllArgsConstructor
public class OrderHistoryRecord {
    @Id
    @GeneratedValue
    @JsonIgnore
    private Long id;

    @NotNull
    @ManyToOne(fetch = FetchType.LAZY, targetEntity = Order.class)
    @JoinColumn(name = "order_id", updatable = false)
    @JsonIgnore
    private Order order;

    @CreatedDate
    private Date date;

    @Enumerated(EnumType.STRING)
    private PaymentStatus paymentStatus;

    @Enumerated(EnumType.STRING)
    private ShipmentStatus shipmentStatus;

    @Enumerated(EnumType.STRING)
    private OrderHistoryRecordType type;
}

最佳答案

我遇到了同样的问题,并通过配置使用 UTC 而不是系统时区的自定义 DateTimeProvider 解决了这个问题,请参见下面的代码。

提到的手动设置值的解决方案对我来说感觉不合适,因为它混淆了 Spring JPA 扩展和 EntityListener 支持,你为什么要使用 Spring 的 JPA 审计?

Spring Boot 1的解决方案

@Configuration
@EnableJpaAuditing(dateTimeProviderRef = "utcDateTimeProvider")
public class JpaConfig {
    @Bean
    public DateTimeProvider utcDateTimeProvider() {
        return () -> new GregorianCalendar(TimeZone.getTimeZone("UTC"));
    }
}

为什么选择 Gregoriancalendar? Spring 将使用转换器 Jsr310ConvertersGregorianCalendar 类型的对象转换为 LocalDateTime .

Spring Boot 2 的解决方案

@Configuration
@EnableJpaAuditing(dateTimeProviderRef = "utcDateTimeProvider")
public class JpaConfig {
    @Bean
    public DateTimeProvider utcDateTimeProvider() {
        return () -> Optional.of(LocalDateTime.now(ZoneOffset.UTC));
    }
}

希望对你有帮助:)

关于java - AuditingEntityListener 的 Spring JPA Hibernate CET 时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55250489/

相关文章:

java - 如何在java中的不同线程中显示和隐藏一个 View ?

java - 解决源代码依赖关系

java - 当超过此主体的最大 session 数时,Spring 安全重定向

java - 使用 jersey 在 URL 中进行 REST 版本控制

java - 如何在 Spring boot 1.5.2 中终止 Hibernates 数据库连接?

java - cURL命令上传文件不上传文件

java - 执行规则时如何更改 drools 对象状态

java - 为什么 lombok 突然停止了我的项目?

java - MongoDB 位置运算符 $ 在 java 中不起作用

java - 我们可以将 Spark 流用于基于时间的事件吗