实体中的本地日期时间在保存时忽略给定格式的最后 3 位数字
Posted
技术标签:
【中文标题】实体中的本地日期时间在保存时忽略给定格式的最后 3 位数字【英文标题】:Local date time in entity ignoring last 3 digits of given format on save 【发布时间】:2019-07-29 22:34:46 【问题描述】:我有一个定义如下的实体。我的是一个 spring data jpa 应用程序。
我使用的是 Spring Boot 版本 1.5.4.RELEASE
当我使用 createDttm 从控制器调用服务时
cretDttm=2019-06-11T11:08:03.520808
它正在保存/更新为 2019-06-11 11:08:03.520000。它正在丢弃本地日期时间的最后 3 位数字。任何修复相同问题的指针。
@Setter
@Getter
@NoArgsConstructor
@Entity
@ToString
@Table(name = "FOO")
public class Foo
@Id
@GeneratedValue
@Column(name = "USER_ID")
private BigInteger userId;
@Column(name = "USER_NAME")
private String userName;
@Column(name = "CRET_DTTM", updatable = false)
private LocalDateTime cretDttm;
@SpringBootApplication
@EntityScan(basePackageClasses = Application.class, Jsr310JpaConverters.class)
public class Application
public static void main(String[] args)
SpringApplication.run(Application.class, args);
更新: 默认的 Jsr310JpaConverters.class 没有转换器来支持 java.sql.Timestamp。我创建了https://thoughts-on-java.org/persist-localdate-localdatetime-jpa/#highlighter_743982 中提到的自定义转换器。注释与此处提到的相同 JPA Cannot Deserialize Java 8 LocalDateTime。它现在正在工作。谢谢。
【问题讨论】:
它保留毫秒,因此得到 3 位数。 【参考方案1】:以下程序显示 LocalDateTime 保留到nanos
(9 位):
public static void main(String[] args)
LocalDateTime dateTime = LocalDateTime.parse("2019-06-11T11:08:03.520808999");
System.out.println(dateTime.toString());
System.out.println(dateTime.getNano());
您能否检查您的数据库列类型,它是否保持到millis
精度或更多?我怀疑您的数据库正在截断micro
粒度(6 位到 3 位)。如果您的数据库支持micros
和nanos
,请选择正确的数据类型。
【讨论】:
我的数据库是 DB2,列大小为 26。直到我调用 repsority.save(myentity) 才能看到。应该如何为 micros 选择一个? @NagendraBusam 存储此数据时间值的列的数据类型是什么? db 列是 TIMESTAMP 我在连接到 PostgreSQL(时间戳数据类型)的 Spring Boot 应用程序(LocalDateTime 数据类型)中运行了一个简单的测试,当我在输入中输入 nanos 时,它保存到微秒。请您检查一下不同的数据库,如 PostgreSQL、SQLite 或 Oracle 吗?我不确定 LocalDateTime 的 DB2 JDBC 驱动程序级别是否发生了某些事情。您是否也尝试使用java.sql.Timestamp
(在保存之前将java.time.LocalDateTime
转换为java.sql.Timestamp
)作为ORM字段的数据类型?
默认的 Jsr310JpaConverters.class 没有转换器来支持 java.sql.Timestamp。我创建了thoughts-on-java.org/persist-localdate-localdatetime-jpa/… 中提到的自定义转换器。注释与此处提到的相同 ***.com/questions/42569951/…。它现在正在工作。谢谢。以上是关于实体中的本地日期时间在保存时忽略给定格式的最后 3 位数字的主要内容,如果未能解决你的问题,请参考以下文章