gpt4 book ai didi

java - AuditingEntityListener 的 Spring JPA Hibernate CET 时区

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:35:20 24 4
gpt4 key购买 nike

我没有成功为我的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com