来自包java.time
的LocalDateTime
的类别为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..
}
为什么你会认为基于价值的课程不应该被序列化?当然,他们可以序列化。这就是为什么它实现了Serializable。 –
好吧,我们现在有这个故事,目前我们只是'@SuppressWarnings(“squid:S3437”)',现在有一个关于dev-list的评论(我会试着去挖掘它)它说*这*可能*禁止这些基于价值的类*被移动到基于价值*类型* – Eugene
@JBNizet这是LocalDateTime真的很奇怪。它也是一个基于值的类。如果您查看oracle文档,您会发现以下有关基于值的类的声明:https:// docs。oracle.com/javase/8/docs/api/java/lang/doc-files/ValueBased.html 一个程序可能产生不可预测的结果,如果它试图两个引用区分的基于值的类[相等的值... ]序列化或任何其他身份敏感机制。这种使用可能会产生不可预测的影响,应予以避免。 – itsme