java.time和JPA
来自包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..
}
回答:
我的答案看起来非常直接而且毫无价值,但它更多的是把事情集中在一起并进行总结。
首先,这个问题没有“金子弹”解决方案。东西肯定要改变,我看到3个选项或3层的替代品:
删除
Serializable
接口。在所有实体上放置Serializable
并不是一个“好习惯”。仅当您要将它的实例用作分离对象时才需要:When and why JPA entities should implement Serializable interface?。使用时间戳类型而不是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