我没有成功为我的 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 将使用转换器 Jsr310Converters
将 GregorianCalendar
类型的对象转换为 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/