在 Spring Boot 3.2.0 中使用 JdbcTemplate 将 Java LocalDate 持久化到 Oracle DATE 列时出现意外的时间组件插入

问题描述 投票:0回答:1

在 Spring Boot 3.2.0 中使用 JdbcTemplate 将 Java LocalDate 值保留在 Oracle DATE 列中时,我们遇到了意外行为。

在升级到 Spring Boot 3.2.0 之前,持久值的时间部分默认为 00:00:00(午夜)。不过,升级后,时间部分现在默认为 12:00:00(中午)。

例如,考虑下表和类:

CREATE TABLE EXAMPLE (
  EXAMPLE_DATE DATE
);
@Repository
public class ExampleRepository {

  private final JdbcTemplate jdbcTemplate;

  public void insert() {

    final String sql = "INSERT INTO EXAMPLE (EXAMPLE_DATE) VALUES (?)";

    this.jdbcTemplate.update(sql, LocalDate.now());
  }
}

使用此类插入 LocalDate 值后,以下数据将保留在示例表中:

SELECT to_char(EXAMPLE_DATE, 'YYYY-MM-DD HH24:MI:SS') FROM EXAMPLE;

2024-01-10 12:00:00

在此 Spring Boot 版本中,ojdbc11 已更新至 23.3.0.23.09。

重新安装 ojdbc11 21.11.0.0 会恢复该行为,并且持久时间组件再次默认为 00:00:00。

Java版本:17

如果您对这种意外行为以及如何解决它有任何见解,我们将不胜感激。

java spring-boot jdbctemplate ojdbc
1个回答
0
投票

这是 23.3.0.23.09 版本的一个已知问题,它将在下一个版本(即 23.4)中修复,在此之前我建议您继续使用 21.11 版本的 JDBC jar。另请注意,23.3.0.23.09 是开发人员版本,因此您应避免在生产中使用它。

© www.soinside.com 2019 - 2024. All rights reserved.