首页 > 解决方案 > 实体中的本地日期时间在保存时忽略给定格式的最后 3 位数字

问题描述

我有一个定义如下的实体。我的是一个弹簧数据 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 无法反序列化 Java 8 LocalDateTime相同。它现在正在工作。谢谢你。

标签: hibernatespring-bootdatetimejpaspring-data-jpa

解决方案


下面的程序显示 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


推荐阅读