java.time 和 JPA

标签 java jpa java-8 sonarqube java.time.instant

java.time 包中的 LocalDateTime 类是 value based classes .如果我有一个实体使用这样的对象作为字段,我会遇到以下“问题”: 基于值的类不应被序列化。但是,JPA 实体必须实现接口(interface) Serializable。这个悖论的解决方案是什么?有人不应该将 LocalDateTime 用作 JPA 实体的字段吗?改用日期?这会令人不满意。

这个问题是 Sonar 规则 squid:S3437 因此项目中有很多错误,因为我们从 Date 更改为 LocalDateTime ...

由于使用基于值的类导致不兼容的解决方案:

@Entity
public class MyEntity implements Serializable{
    @Column
    private String id; // This is fine
    @Column
    private LocalDateTime updated; // This is not ok, as LocalDateTime is a value based class
    @Column
    private Date created; // This however is fine..
}

最佳答案

我的回答看似很直接,毫无值(value),但更多的是为了整理和总结。

首先,这个问题没有“金弹”解决方案。有些东西肯定必须改变,我看到 3 个选项或 3 个备选方案:

  1. 删除Serializable 接口(interface)。将 Serializable 放在所有实体上并不是一个“好的做法”。仅当您要将它的实例用作分离对象时才需要它:When and why JPA entities should implement Serializable interface? .

  2. 使用时间戳类型而不是 LocalDateTime。在我看来是等价的:

https://github.com/javaee/jpa-spec/issues/63

Instant, LocalDateTime, OffsetDateTime, and ZonedDateTime map as timestamp values by default. You may mark a property of one of these types with @TeMPOraL to specify a different strategy for persisting that property.

  1. 如果前两个选项都不适合您,那么(我很确定,您知道该怎么做)- 取消此警告 @SuppressWarnings("squid:S3437")

关于java.time 和 JPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47865312/

相关文章:

java - getReference() 和 load() 之间的区别

java-8 - Joda-Time 到 Java 8 的 DateTimeZone 中的 UTC 到本地方法

java - 从哪里获得 JDK 8 for Windows 的 Fastdebug/Debug 版本?

java - websphere 8.5.5.6 服务器有 java 6 和 7 但我需要 java 8 如何将 java sdk 添加到现有的 websphere 服务器

java - 我应该使用 slf4j isTraceEnabled 吗?

java - 在Java中将文本文件读取到数组中

java - 如何使 JFilechooser 允许用户仅从一个文件夹中进行选择?

java - 从后端异步更新 UI

java - JPA Sybase时间戳,如何检索

java - 在 JUnit 中获取当前的 Spring 事务并提交它