La pregunta está en el título. A continuación, acabo de describir algunos de mis pensamientos y hallazgos.
Cuando tenía un modelo de dominio muy simple (3 tablas sin ninguna relación), todas mis entidades NO implementaban Serializable.
Pero cuando el modelo de dominio se volvió más complejo, obtuve RuntimeException que decía que una de mis entidades no implementó Serializable.
Yo uso Hibernate como una implementación JPA.
Me pregunto:
- ¿Es un requisito / comportamiento específico del proveedor?
- ¿Qué pasa con mis entidades serializables? ¿Deben ser serializables para almacenar o transferir?
- ¿En qué momento es necesario hacer que mi entidad sea serializable?
Serializable
son dos conceptos diferentes.De acuerdo con las especificaciones JPA:
"JSR 220: Enterprise JavaBeansTM, Versión 3.0 Java Persistence API Versión 3.0, Versión final 2 de mayo de 2006"
fuente
Serializable
podría ser útil con eso, y en el contexto de persistencia más consistente que,Cloneable
por ejemplo.Necesita que sean sus entidades
Serializable
si necesita transferirlas por cable (serializarlas a otra representación), almacenarlas en una sesión http (que a su vez serializa en el disco duro mediante el contenedor de servlets), etc.Solo por persistencia,
Serializable
no es necesario, al menos con Hibernate. Pero es una buena práctica hacerlosSerializable
.fuente
De acuerdo con los documentos de hibernación , al usar la anotación @JoinColumn:
fuente
Para complementar la buena respuesta de Conor que se refirió a las especificaciones JSR-317. Por lo general, los proyectos EAR consisten en un módulo EJB con los EJB expuestos a través de una interfaz remota. En este caso, debe hacer que sus beans de entidad sean serializables, ya que se agregan en el EJB remoto y se crean para conectarse a través de la red.
Un proyecto de guerra JEE6 sin CDI: puede contener EJB lite respaldado por entidades JPA no serializables.
Un proyecto de guerra JEE6 con CDI: los beans que usan el alcance de sesión, aplicación o conversación deben ser serializables, pero los beans que usan el alcance de la solicitud no tienen que ser serializables. Por lo tanto, los beans de entidad JPA subyacentes -si los hay- seguirían la misma semántica.
fuente
Si solo hablamos de persistencia,
Serializable
no es necesario Pero es la mejor práctica hacer las entidadesSerializable
.Si estamos exponiendo
domain
/entities
objetos directamente expuestos a la capa de presentación, en lugar de usarDTO
, en ese caso necesitamos implementarSerializable
. Estos objetos de dominio se pueden almacenar conHTTPSession
fines de almacenamiento en caché / optimización. Una sesión http puede ser serializada o agrupada. Y también es necesario para transferir datos entreJVM
instancias.Cuando usamos
DTO
para desacoplar la capa de persistencia y la capa de servicio, marcar los objetos del dominio comoSerializable
contraproducentes y violaría el "encapsulation
". Entonces se convierte en un antipatrón.Identificadores compuestos
La clase de clave primaria debe ser serializable.
Modelos POJO
Si una instancia de entidad se va a utilizar de forma remota como un objeto separado, la clase de entidad debe implementar la
Serializable
interfaz.Caché
Además, si está implementando un
clustered
segundo nivel,cache
entonces sus entidades deben serloserializable
. El identificador debe serSerializable
porque es un requisito de JPA, ya queidentifier
podría usarse como la clave para una entrada de caché de segundo nivel.Y cuando serializamos entidades, asegúrese de proporcionar un
serialVersionUID
modificador de acceso privado explícito . Porque si unaserializable
clase no declara explícitamente aserialVersionUID
, entonces el tiempo de ejecución de serialización calculará unserialVersionUID
valor predeterminado para esa clase en función de varios aspectos de la clase, como se describe en la Especificación de serialización de objetos Java (TM). ElserialVersionUID
cálculo predeterminado es muy sensible a los detalles de la clase que pueden variar según las implementaciones del compilador y, por lo tanto, pueden resultar inesperadosInvalidClassExceptions
durante la deserialización.fuente
Creo que su problema está relacionado con tener un campo de un tipo complejo (clase) que no está anotado. En tales casos, el manejo predeterminado será almacenar el objeto en su forma serializada en la base de datos (lo que probablemente no sea lo que pretendía hacer) Ejemplo:
En el caso anterior, CustomerData se guardará en un campo de matriz de bytes en la base de datos en su forma serializada.
fuente
Especificación JPA
De acuerdo con la especificación JPA, una entidad debe implementarse
Serializable
solo si necesita pasar de una JVM a otra o si la entidad es utilizada por un bean de sesión con estado que necesita ser pasivado por el contenedor EJB.Hibernar
Hibernate solo requiere que los atributos de la entidad sean
Serializable
, pero no la entidad misma.Sin embargo, al implementar la especificación JPA, todos los requisitos de JPA con respecto a las
Serializable
entidades también se aplican a Hibernate.Gato
Según la documentación de Tomcat , los
HttpSession
atributos también deben serSerializable
:Por lo tanto, si la entidad se almacena en el
HttpSession
, debe implementarSerializable
.fuente
Las clases deben implementar Serializable si desea serializarlas. Esto no está directamente relacionado con JPA y la especificación JPA no requiere que las entidades sean serializables. Si Hibernate realmente se queja de esto, supongo que es un error de Hibernate, pero supongo que directa o indirectamente está haciendo algo más con las entidades, lo que requiere que sean serializables.
fuente
Consulte http://www.adam-bien.com/roller/abien/entry/do_jpa_entities_have_to dice, La implementación de java.io.Serializable es simplemente necesaria para transferir datos a través de IIOP o JRMP (RMI) entre instancias JVM. En el caso de una aplicación web pura, los objetos de dominio a veces se almacenan en HTTPSession para fines de almacenamiento en caché / optimización. Una sesión http puede ser serializada (pasivación) o agrupada. En ambos casos, todo el contenido debe ser serializable.
fuente
el golpe remoto usando cartero o ajax o angular js, etc ....., puede causar la repetición del ciclo con la excepción StackOverflow con Jackson más rápidoxml. Por lo tanto, es mejor usar serializador.
fuente
La implementación de ehcache con el almacén de discos como caché de segundo nivel (es decir, utilizando
@Cacheable
anotaciones en la entidad o en el método de repositorio / servicio) requiere Serializable; de lo contrario, la caché fallará (NotSerializableException
) al escribir la entidad en la caché de disco.fuente
Este es también el error que se produce cuando pasa una ID incorrectamente escrita como el segundo parámetro a algo como em.find () (es decir, pasa la entidad en lugar de su ID). Todavía no he encontrado necesario declarar las entidades JPA serializables: no es realmente necesario a menos que esté usando el nombre de columna referenciado como lo describe aman.
fuente
cuando las entidades JPA se utilizan como parámetros o valores de retorno por las operaciones EJB remotas
fuente