Ce n'est pas tout à fait vrai. From the Javadoc, la signature des méthodes pertinentes est:
public Object get(Class clazz, Serializable id) ...
public Object load(Class theClass, Serializable id) ...
(pièces et autres versions surchargées non pertinentes omis par souci de concision). Ainsi, l'entité à charger peut appartenir à n'importe quelle classe, seul son identificateur doit être sérialisable.
Les entités en effet ne peuvent pas être sérialisables, selon cette citation de Java Persistence with Hibernate, ch. 13.3.2:
Les instances persistantes sont stockées dans le cache de second niveau sous une forme désassemblée . Pensez au désassemblage comme un processus un peu comme la sérialisation (l'algorithme est beaucoup, beaucoup plus rapide que la sérialisation Java, cependant).
Donc je suppose que les identifiants (dans le cache de requête) ne sont pas non plus sérialisés. Je ne pouvais pas trouver d'explication sur pourquoi id
est déclaré Serializable
, et manquant de cela, je ne peux que deviner. L'API a besoin d'un type pour le paramètre id
, qui doit être un supertype commun d'au moins les types d'identificateur fréquemment utilisés Number
et String
, et à l'exception de Object
, Serializable
est le seul choix.
mais est-ce la mise en cache sur l'option par défaut de plusieurs JVM? Je pense que ce n'est pas le cas, et si je configure le cache ou le cluster, je rendrai mes objets sérialisables. Mais pourquoi hiberner doit-il me forcer à utiliser la sérialisation lorsque je n'utilise pas de cache distribué? – Reddy
Non, ce n'est pas activé par défaut. J'imagine que l'implémentation de l'implémentation Serializable devrait permettre à un développeur de reconnaître qu'un objet de valeur peut être soumis à la sérialisation et devrait donc être conçu de cette manière. Juste une supposition, je n'y ai jamais vraiment réfléchi et je ne l'ai même pas reconnu avant d'avoir lu votre question. – perdian