La question est dans le titre. Ci-dessous, je viens de décrire certaines de mes pensées et conclusions.
Quand j'avais un modèle de domaine très simple (3 tables sans aucune relation), toutes mes entités n'ont PAS implémenté Serializable.
Mais quand le modèle de domaine est devenu plus complexe, j'ai eu RuntimeException qui a dit qu'une de mes entités n'a pas implémenté Serializable.
J'utilise Hibernate comme implémentation JPA.
Je me demande:
- Est-ce une exigence / un comportement spécifique au fournisseur?
- Que se passe-t-il avec mes entités sérialisables? Devraient-ils être sérialisables pour le stockage ou pour le transfert?
- A quel moment il devient nécessaire de rendre mon entité sérialisable?
Serializable
sont deux concepts différents.Selon les spécifications JPA:
«JSR 220: Enterprise JavaBeansTM, version 3.0 API de persistance Java version 3.0, version finale le 2 mai 2006»
la source
Serializable
pourrait être utile avec cela, et dans le contexte de la persistance plus cohérente queCloneable
par exemple.Vous avez besoin que vos entités soient
Serializable
si vous devez les transférer via le fil (les sérialiser vers une autre représentation), les stocker dans une session http (qui est à son tour sérialisée sur le disque dur par le conteneur de servlet), etc.Juste pour des raisons de persistance,
Serializable
n'est pas nécessaire, du moins avec Hibernate. Mais c'est une bonne pratique de les faireSerializable
.la source
Selon la documentation Hibernate, lors de l'utilisation de l'annotation @JoinColumn:
la source
Pour compléter la belle réponse de Conor qui a fait référence aux spécifications du JSR-317. En règle générale, les projets EAR consistent en un module EJB avec les EJB exposés via une interface distante. Dans ce cas précis, vous devez rendre vos beans entité sérialisables car ils sont agrégés dans l'EJB distant et sont construits pour être câblés via le réseau.
Un projet de guerre JEE6 sans CDI: peut contenir EJB lite soutenu par des entités JPA non sérialisables.
Un projet de guerre JEE6 avec CDI: les beans qui utilisent l'étendue de session, d'application ou de conversation doivent être sérialisables, mais les beans qui utilisent l'étendue de requête ne doivent pas nécessairement être sérialisables. Ainsi, les beans entité JPA sous-jacents - le cas échéant - suivraient la même sémantique.
la source
Si nous parlons simplement de persistance, ce
Serializable
n'est pas nécessaire, mais il est préférable de créer les entitésSerializable
.Si nous exposons
domain
/entities
objets directement exposés à la couche de présentation, au lieu d'utiliserDTO
, Dans ce cas, nous devons implémenterSerializable
. Ces objets de domaine peuvent être stockés à desHTTPSession
fins de mise en cache / d'optimisation. Une session http peut être sérialisée ou mise en cluster. Et il est également nécessaire pour le transfert de données entreJVM
-instances.Lorsque nous utilisons
DTO
pour découpler la couche de persistance et la couche de service, marquer les objets de domaine commeSerializable
étant contre-productif et violerait le «encapsulation
». Ensuite, cela devient un anti-modèle.Identifiants composites
La classe de clé primaire doit être sérialisable.
Modèles POJO
Si une instance d'entité doit être utilisée à distance en tant qu'objet détaché, la classe d'entité doit implémenter l'
Serializable
interface.Cache
De plus, si vous implémentez un
clustered
deuxième niveau,cache
vos entités doivent l'êtreserializable
. L'identifiant doit êtreSerializable
parce que c'est une exigence JPA car ilidentifier
peut être utilisé comme clé pour une entrée de cache de deuxième niveau.Et lorsque nous sérialisons des entités, assurez-vous de fournir explicitement
serialVersionUID
un modificateur d'accès privé. Parce que si uneserializable
classe ne déclare pas explicitement aserialVersionUID
, alors le runtime de sérialisation calculera uneserialVersionUID
valeur par défaut pour cette classe en fonction de divers aspects de la classe, comme décrit dans Spécification de sérialisation d'objets Java (TM). LeserialVersionUID
calcul par défaut est très sensible aux détails de classe qui peuvent varier en fonction des implémentations du compilateur et peuvent donc entraîner des résultats inattendusInvalidClassExceptions
lors de la désérialisation.la source
Je crois que votre problème est lié au fait d'avoir un champ de type complexe (classe) qui n'est pas annoté. Dans de tels cas, la gestion par défaut stockera l'objet sous sa forme sérialisée dans la base de données (ce qui n'est probablement pas ce que vous vouliez faire) Exemple:
Dans le cas ci-dessus, CustomerData sera enregistré dans un champ de tableau d'octets de la base de données sous sa forme sérialisée.
la source
Spécification JPA
Selon la spécification JPA, une entité ne doit implémenter
Serializable
que si elle doit être transmise d'une JVM à une autre ou si l'entité est utilisée par un Stateful Session Bean qui doit être passivé par le conteneur EJB.Hiberner
Hibernate exige uniquement que les attributs d'entité soient
Serializable
, mais pas l'entité elle-même.Cependant, en implémentant la spécification JPA, toutes les exigences JPA concernant
Serializable
entités s'appliquent également à Hibernate.Matou
Selon la documentation Tomcat , les
HttpSession
attributs doivent également êtreSerializable
:Ainsi, si l'entité est stockée dans le
HttpSession
, elle doit implémenterSerializable
.la source
Les classes doivent implémenter Serializable si vous souhaitez les sérialiser. Ceci n'est pas directement lié à JPA et la spécification JPA n'exige pas que les entités soient sérialisables. Si Hibernate se plaint vraiment de cela, je suppose que c'est un bogue d'Hibernate, mais je suppose que vous faites directement ou indirectement autre chose avec les entités, ce qui nécessite qu'elles soient sérialisables.
la source
Veuillez vous référer à http://www.adam-bien.com/roller/abien/entry/do_jpa_entities_have_to il est dit, l'implémentation de java.io.Serializable est simplement nécessaire pour le transfert de données via IIOP ou JRMP (RMI) entre les instances JVM. Dans le cas d'une application Web pure, les objets de domaine sont parfois stockés dans HTTPSession à des fins de mise en cache / d'optimisation. Une session http peut être sérialisée (passivation) ou mise en cluster. Dans les deux cas, tout le contenu doit être sérialisable.
la source
hit à distance en utilisant postman ou ajax ou angular js etc.
la source
L'implémentation d'ehcache avec diskstore comme cache de second niveau (c'est-à-dire en utilisant l'
@Cacheable
annotation sur l'entité ou la méthode référentiel / service) nécessite Serializable, sinon le cache échouera (NotSerializableException
) pour écrire l'entité dans le cache disque.la source
C'est aussi l'erreur qui est lancée lorsque vous passez un ID mal tapé comme deuxième paramètre à quelque chose comme em.find () (c'est-à-dire en passant l'entité elle-même plutôt que son ID). Je n'ai pas encore trouvé nécessaire de déclarer réellement les entités JPA sérialisables - ce n'est pas vraiment nécessaire, sauf si vous utilisez referencedColumnName comme décrit par aman.
la source
lorsque des entités JPA sont utilisées comme paramètres ou retournent des valeurs par les opérations EJB distantes
la source