【发布时间】: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 answer 和this answer 了解如何将java.timeAPI 与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