Spring Boot 3 + Hibernate 6 迁移:时区映射问题

2023-12-26

我正在将 Spring Boot 2 + Hibernate 5 应用程序升级到 Spring Boot 3 和 Hibernate 6。更新时,我注意到 Hibernate 6 处理 java Instant 字段到没有时区信息的表列之间的转换的方式与 Hibernate 5 不同。

在 Hibernate 6 中,当持久化一个实例字段具有值的对象时2023-02-20T04:08:00Z,该值被映射到2023-02-20T05:08:00Z检索后。正如所解释的here https://thorben-janssen.com/hibernate-6-offsetdatetime-and-zoneddatetime/这可能与映射“即时”和“持续时间”字段的新方式有关。

我设法通过添加来解决这个问题@JdbcType(InstantAsTimestampJdbcType.class)给每个Instant领域中的每一个@Entity应用程序中的类。但是,我宁愿对此事进行单一的集中配置,而不是向应用程序中的每个 Instant 字段添加注释。我尝试了几种方法:

选项 1:添加属性hibernate.timezone.default_storage并尝试了所有存储类型选项(source https://thorben-janssen.com/hibernate-6-offsetdatetime-and-zoneddatetime/#5_different_TimezoneStorageTypes):

spring.jpa.properties.hibernate.timezone.default_storage=NORMALIZE_UTC

选项 2:声明 HibernatePropertiesCustomizer bean:

    @Bean
    public HibernatePropertiesCustomizer hibernatePropertiesCustomizerPG() {

        return hibernateProperties -> {
            hibernateProperties.put(EntityManagerFactoryBuilderImpl.TYPE_CONTRIBUTORS,
                    (TypeContributorList) () -> List.of(
                            (TypeContributions typeContributions, ServiceRegistry serviceRegistry) ->
                                    typeContributions.contributeJdbcType(InstantAsTimestampJdbcType.INSTANCE)));
        };
    } 

选项 3:创建HibernatePropertiesCustomizer:

@Configuration
public class HibernateTypeContributorConfiguration implements HibernatePropertiesCustomizer {

    @Override
    public void customize(Map<String, Object> hibernateProperties) {
        hibernateProperties.put(
                EntityManagerFactoryBuilderImpl.TYPE_CONTRIBUTORS,
                (TypeContributorList) () -> List.of((jdbcType, serviceRegistry) -> jdbcType.contributeJdbcType(InstantAsTimestampJdbcType.INSTANCE))
        );
    }
}

不幸的是,到目前为止,这些方法都没有奏效。有谁知道如何InstantAsTimestampJdbcType可以注册吗?或者有更好的方法来解决这个问题吗?

请注意,修改表列以添加时区信息不是一种选择。


默认情况下,Hibernate 6 映射Instant到 SQL 类型代码SqlTypes.TIMESTAMP_UTC。此类型代码(默认情况下)映射到InstantAsTimestampWithTimeZoneJdbcType or InstantAsTimestampJdbcType取决于的能力Dialect's TimeZoneSupport。这两个JdbcTypes 将转换Instant在将其发送到数据库之前,先将其转换为以 UTC 表示的时间戳。

如果你设置hibernate.type.preferred_instant_jdbc_type=TIMESTAMP,那么这应该强制 Hibernate 使用TimestampJdbcType,这将not归一化为 UTC,并且将简单地转换Instant到本地时间戳并将其发送到数据库。

您能尝试一下吗?请告诉我是否有您想要的效果?

PS请注意,使用@JdbcTypeCode(TIMESTAMP) or @JdbcType(TimestampJdbcType.class)应该与配置属性具有相同的效果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot 3 + Hibernate 6 迁移:时区映射问题 的相关文章

  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • 在 Bash 中监控 tomcat,直到它完成部署 war 或应用程序

    怎么可能Tomcat在 bash 脚本中进行监控以检测它是否完成了战争或应用程序的部署 应用场景 Tomcat 开始于systemd Tomcat 开始于catalina sh 使用 Tomcat 管理器 Tomcat从Eclipse启动
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • Hibernate 的 PersistentSet 不使用 hashCode/equals 的自定义实现

    所以我有一本实体书 public class Book private String id private String name private String description private Image coverImage pr
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • java for windows 中的文件图标叠加

    我正在尝试像 Tortoise SVN 或 Dropbox 一样在文件和文件夹上实现图标叠加 我在网上查了很多资料 但没有找到Java的解决方案 Can anyone help me with this 很抱歉确认您的担忧 但这无法在 Ja
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • 创建一个 JSON 对象以在 Spring Boot 测试中发布

    我想编写基本测试来使用 JSON 负载在 users URL 上执行 POST 请求来创建用户 我找不到如何将新对象转换为 JSON 到目前为止有这么多 这显然是错误的 但解释了目的 Test public void createUser
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其

随机推荐