206 votes

Quand et pourquoi les entités JPA doivent-elles implémenter une interface sérialisable?

La question est dans le titre. Ci-dessous je viens de décrire certaines de mes réflexions et conclusions.

Quand j'ai eu très simple modèle de domaine (3 tables, sans relations) toutes mes entités n'est PAS Sérialisable.

Mais lorsque le domaine modèle est devenu plus complexe, j'ai eu RuntimeException qui a dit que l'une de mes entités n'ont pas Sérialisable.

J'utilise Hibernate comme une implémentation JPA.

Je me demande:

  1. Est-il spécifique au fournisseur exigence/comportement?
  2. Ce qui se passe avec mon serializable entités? Devraient-ils être sérialisable pour le stockage ou pour le transfert?
  3. À quel moment il devient nécessaire de faire de mon entité sérialisable?

122voto

Conor Points 1049

Selon les spécifications JPA:

"Si une instance d'entité doit être transmise par valeur en tant qu'objet détaché (par exemple, via une interface distante), la classe d'entités doit implémenter l'interface Serializable."

"JSR 220: Enterprise JavaBeansTM, version 3.0 de l'API de persistance Java, version 3.0, version finale du 2 mai 2006"

84voto

Bozho Points 273663

Vous avez besoin que vos entités soient Serializable si vous devez les transférer par câble (les sérialiser sur une autre représentation), les stocker dans une session http (elle-même sérialisée sur le disque dur par la servlet). conteneur), etc.

Juste pour des raisons de persistance, Serializable n'est pas nécessaire, du moins avec Hibernate. Mais il est recommandé de les utiliser Serializable .

67voto

Aaron Digulla Points 143830

Cela se produit généralement si vous mélangez des requêtes HQL et SQL natives. Dans HQL, Hibernate mappe les types que vous transmettez à ce que le DB comprend. Lorsque vous exécutez du SQL natif, vous devez alors effectuer le mappage vous-même. Sinon, le mappage par défaut consiste à sérialiser le paramètre et à l'envoyer à la base de données (dans l'espoir qu'il le comprenne).

8voto

Sam Points 1078

Pour compléter la belle réponse de Conor, qui a rappelé la JSR-317 cahier des charges. Généralement, l'OREILLE projets se composent d'un module EJB les Ejb exposé via une interface à distance. Dans ce cas vous avez besoin pour faire de votre entité haricots serializable comme ils sont regroupés dans la distance EJB et sont construites pour être câblé par le biais du réseau.

Un JEE6 guerre de projet sans CDI: peut contenir des EJB lite soutenu par des non-sérialisable des entités JPA.

Un JEE6 guerre de projet avec le CDI: Haricots que l'utilisation de la session, de l'application ou de la conversation champ d'application doit être sérialisable, grains de mais qui demande d'utilisation champ d'application n'ont pas à être sérialisable. Ainsi, le sous-jacent JPA, ejb entity -le cas échéant - de suivre la même sémantique.

6voto

jarnbjo Points 18238

Les classes doivent implémenter Serializable si vous souhaitez les sérialiser. Cela n'est pas directement lié à JPA et la spécification JPA ne nécessite pas que les entités soient sérialisables. Si Hibernate se plaint vraiment à ce sujet, je suppose que c'est un bogue d'Hibernate, mais je suppose que vous faites directement ou indirectement quelque chose de différent avec les entités, ce qui les oblige à être sérialisables.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X