java.time和JPA

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

这个问题是一个声纳规则squid:S3437,因此也有很多项目的错误的,因为我们从日期到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..

}

回答:

我的答案看起来非常直接而且毫无价值,但它更多的是把事情集中在一起并进行总结。

首先,这个问题没有“金子弹”解决方案。东西肯定要改变,我看到3个选项或3层的替代品:

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

  2. 使用时间戳类型而不是LocalDateTime。在我看来,这是等价的:默认情况下

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

即时,LocalDateTime,OffsetDateTime和ZonedDateTime地图为 时间戳值。您可以使用@TeMPOraL标记这些 类型之一的属性,以指定用于坚持 该属性的不同策略。

  • 如果两个第一选项不为你工作,然后(我敢肯定,你知道该怎么做) - 禁止这种警告@SuppressWarnings("squid:S3437")
  • 回答:

    我不太明白DB从jpa接受的内容。当我处理的Postgres,我使用自定义的转换器:

    import javax.persistence.AttributeConverter; 

    import javax.persistence.Converter;

    import java.sql.Timestamp;

    import java.time.LocalDateTime;

    @Converter(autoApply = true)

    public class LocalDateTimePersistenceConverter implements AttributeConverter<LocalDateTime, Timestamp> {

    @Override

    public Timestamp convertToDatabaseColumn(LocalDateTime locDateTime) {

    return (locDateTime == null ? null : Timestamp.valueOf(locDateTime));

    }

    @Override

    public LocalDateTime convertToEntityAttribute(Timestamp sqlTimestamp) {

    return (sqlTimestamp == null ? null : sqlTimestamp.toLocalDateTime());

    }

    }

    我使用这种方式:

    @Column(name = "create_date") 

    @Convert(converter = LocalDateTimePersistenceConverter.class)

    private LocalDateTime createDate;

    你看,我在这里转换LocalDateTime到时间戳(Postgres所接受)和背部。

    以上是 java.time和JPA 的全部内容, 来源链接: utcz.com/qa/262053.html

    回到顶部