• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

java.time和JPA

java 来源:itsme 3次浏览

来自包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")

  • 版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
    喜欢 (0)