Java 如何在Hibernate实体类中使用基于值的类

Java 如何在Hibernate实体类中使用基于值的类,java,hibernate,jpa,serialization,Java,Hibernate,Jpa,Serialization,我有一个Hibernate实体类,它实现了带有LocalDate(类)字段的可序列化接口 根据JPA规范 如果实体实例要作为分离对象(例如,通过远程接口)按值传递,则实体类必须实现可序列化 接口 在我的例子中,我不打算在不同的JVM中使用对象,因此不需要通过网络进行序列化和发送。另一方面,使用缓存系统证明了实现可序列化接口的必要性 我们对这个项目有一个明确的目标。关于我的案例的其中一条规则如下,我引用的是SonarQube规则 如果程序试图区分对基于值的类的相等值的两个引用,无论是直接通过引用相

我有一个Hibernate实体类,它实现了带有LocalDate(类)字段的可序列化接口

根据JPA规范

如果实体实例要作为分离对象(例如,通过远程接口)按值传递,则实体类必须实现可序列化 接口

在我的例子中,我不打算在不同的JVM中使用对象,因此不需要通过网络进行序列化和发送。另一方面,使用缓存系统证明了实现可序列化接口的必要性

我们对这个项目有一个明确的目标。关于我的案例的其中一条规则如下,我引用的是SonarQube规则

如果程序试图区分对基于值的类的相等值的两个引用,无论是直接通过引用相等还是间接通过调用同步、标识哈希、序列化,都可能产生不可预测的结果

现在,假设我开始使用一种基于磁盘的缓存机制,然后基于上述规则和以下事实:在我的实体中,它是可序列化的,并且使用一个基于值的字段,它不能转换为瞬态


最好的做法是什么?在可序列化的Hibernate实体中使用基于值的字段的正确方法是什么?

注释基本上说,您不应该尝试将任何逻辑基于LocalDate的标识(即,在LocalDate上同步,尝试用
=
!=
区分两个相等的LocalDate,将它们用作标识映射的键,等等)

这并不意味着不能序列化包含LocalDate的类。LocalDate实现了Serializable,因此不会引起任何问题


我的猜测是,作者关于序列化的意思是,您不应该假设序列化然后反序列化LocalDate会给您一个具有不同标识的LocalDate,就像您可以安全地假设传统类那样


简言之,将LocalDate视为没有标识。

注释基本上说,您不应尝试将任何逻辑基于LocalDate的标识(即,在LocalDate上同步,尝试用==或!=区分两个相等的LocalDate,将它们用作IdentityMap的键,等等)。这并不意味着您不能序列化包含LocalDate的类。LocalDate实现可序列化,因此不会引起任何问题。另外,顺便说一句,JPA规范没有规定实体必须可序列化。它说:“如果实体实例要作为分离对象(例如,通过远程接口)按值传递,则,实体类必须实现可序列化接口”(这对任何类都适用)。谢谢。我更新了规范部分。但在规则中特别提到了序列化。您的示例更倾向于同步、身份哈希,但这里的最后一点,即序列化,会发生什么?我猜作者的意思是,您不应该假设序列化然后应序列化LocalDate将为您提供一个具有不同实体的LocalDate,这一点您可以在传统类中安全地假设。简而言之,将LocalDate视为没有标识。我的意思是,使用不同的标识。