java.time和JPA

its*_*sme 6 java jpa java-8 sonarqube java.time.instant

类作为LocalDateTime从封装java.time基于值类.如果我有一个实体使用这样的对象作为字段,我会遇到以下"问题":不应序列化基于值的类.但是,JPA实体必须实现Serializable接口.这个悖论的解决方案是什么?不应该有人使用LocalDateTime作为JPA实体的字段吗?使用日期代替?这将是不满意的.

这个问题是一个声纳规则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..
}
Run Code Online (Sandbox Code Playgroud)

And*_*niy 2

我的回答可能看起来很直接而且毫无价值,但更多的是为了整理和总结。

首先,这个问题没有“金弹”解决方案。有些事情肯定需要改变,我看到了 3 个选项或 3 个替代方案:

  1. 删除Serializable接口。放置所有实体并不是一个“良好实践” Serializable。仅当您打算将其实例用作分离对象时才需要它:何时以及为什么 JPA 实体应该实现 Serialized 接口?

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

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

Instant、LocalDateTime、OffsetDateTime 和 ZonedDateTime 默认映射为时间戳值。您可以使用 @TeMPOraL 标记其中一种类型的属性,以指定保留该属性的不同策略。

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