【问题标题】:Storing java.time.Instant in SQL Server in a readable way以可读的方式在 SQL Server 中存储 java.time.Instant
【发布时间】:2021-10-22 07:39:27
【问题描述】:

我正在更新处理包裹递送的应用程序。 使用的技术:java 8 和 hibernate 5.1(可以升级到最新版本)SQL Server

到目前为止,该应用程序仅在一个国家/地区使用,系统中的所有事件(包裹注册、包裹交付等)都在代码中进行管理,并使用旧的 java Date 存储在数据库中。实体,计算,一切都使用java.util.Date。 我想使用 java 8 时间类编写新模块。

这些事件将使用新的java.time.Instant 类,因为它是一个特定且独立于时区的时刻。

问题:是否有可能用java.time.Instant 定义实体和用人类可读的定义定义数据库架构?

默认情况下,使用 Instant 声明实体时:

    @Column(name = "Event")
    protected Instant event;

数据库架构创建为Event varbinary(255),无法读取。

我可以在数据库中将其定义为Event datetime,但我必须将其定义为java.sql.Timestamp,并每次都转换为java.time.Instant

是否缺少一些 SQL Server 定义?也许一些实体注释可以使转换变得容易?可能有一些不同的类用作实体字段以使转换变得微不足道?我应该使用与java.time 包不同的类吗?

【问题讨论】:

  • 我推荐你使用OffsetDateTime。查看this answerthis answer 了解如何将java.time API 与JDBC 结合使用。
  • 您可以使用 LocalDateTime docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/… 同时修复区域 ID
  • @ArvindKumarAvinash 感谢您提供的链接,但这些似乎对我没有帮助。首先,它们是关于 MySQL 而不是 SQL Server。其次,他们根本没有提到实体映射。第三,OffsetDateTime 也是使用不可读的 varbinary 存储的。
  • 为什么需要可读性?即使在 Java 中,java.time.Instant 也是一种复合类型:自 1970-002-02T00:00:00Z 以来的 Epoch 秒为 64 位长,剩余的纳秒为 32 位 int。 binary(12) 足以存储这 96 位。如果你想让它“可读”,那么你需要编写自己的代码来将其转换成类似decimal(38,9) 的东西,其中整个部分编码秒,小数部分编码纳秒。
  • @AlwaysLearning 客户端习惯于在数据库中拥有易于阅读的日期。准备数据或修改数据要容易得多,即使对于非技术人员也是如此。服务,寻找错误,测试,你的名字更容易。想象一下,如果所有数据都以二进制形式存储,那将是多么烦人。

标签: java sql-server hibernate jpa java-8


【解决方案1】:

我认为对于 5.1 版,您仍然需要一个包含 Java 8 时间类型的类型实现的特殊工件:https://search.maven.org/artifact/org.hibernate/hibernate-java8/5.1.0.Final/jar

依赖于 Java 8 的较新 Hibernate 版本已经包含在 hibernate-core 中。

【讨论】:

    猜你喜欢
    • 2019-04-11
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多