J'ai les suivantes Entité racine de l'héritage joincière pour les zones géographiques (comme des continents, des pays, des états, etc.): Comme vous pouvez le voir une zone d'auto-identification unique. Pk, un nom et une relation avec son parent (référence auto). Veuillez faire attention à la relation Les sous-classes définissent des propriétés supplémentaires et ne sont pas de intérêt vraiment. Les données de la base de données sont correctement liées car les zones GEO peuvent être répertoriées sans problèmes via JPQL (avec un Chaque ligne est une Instance de: p> Lors de la requête de liste avec le parent mappé comme paresseux, je reçois l'exception suivante: p> L'imprimeur avant la trace de la pile est la suivante: p> parent code> géo mappée comme
fetchtype.lazy code>. Dans la DB, le
parent_id code> est
non null code> rendant la relation en option. La valeur par défaut pour
@manytoone code> est
en option = true code>, de sorte que les mappages semblent être corrects. P>
fetchtype.eager légèrement différent Code> Mappage sur
Parent code>, voir Fin du texte) : p>
p>
13:57:47,245 INFO [stdout] (http--127.0.0.1-8080-4) arena = Joachim-Schumann-Schule: using club's district parent = com.kawoolutions.bbstats.model.State@2b60693e[id=258,name=Hesse,isoCode=HE,country=com.kawoolutions.bbstats.model.Country@17f9976b[id=88,name=Germany,isoCode=DE,isoNbr=276,dialCode=<null>]]
3 Réponses :
Le problème avec le chargement paresseux est que Hibernate générera de manière dynamique des proxies pour des objets paresseusement chargés. Pendant d'abord, cela semble être une bonne idée de mettre en œuvre le chargement paresseux, un développeur doit être conscient du fait qu'un objet peut être un proxy hibernate. Je pense que c'est un bon exemple d'abstraction fuite. Dans votre cas, la valeur de retour de l'appel Ces proxy d'hibernation entraîneront des problèmes liés à des mises, d'instanceOf et d'appels vers lire Cette question et cette réponse indique comment utiliser l'interface de marqueur Au fait, réfléchissez à la fossé que "Notation hongroise"; -) P>
édité pour répondre aux questions du commentaire: P>
existe-t-il une voie portable (JPA) pour y parvenir? em> strong> p>
pas que je sache. Je résumés la logique de conversion de l'autre Qa à l'extérieur derrière une interface et fournissez une autre implémentation noop en utilisant JBoss 7 et CDI, vous pouvez passer à celui-ci sans même recompiler. P>
peut-il être automatisé? em> strong> p>
Il pourrait être possible d'utiliser AspectJ. Vous pouvez essayer d'écrire un di.getparent () code> est un objet de proxy, généré à travers la bibliothèque Javassist utilisé par Hibernate. P>
égaux () code> et
hashcode () code> Si vous n'avez pas mis en œuvre ces méthodes de votre entité . p>
HibernateProxy Code> Pour convertir un proxy en objet réel. L'autre option est d'aller avec le chargement impatient dans ce cas. P>
autour de code> conseils pour tous les appels de getters sur vos entités qui renvoient d'autres entités. Le conseil vérifiera si le champ sous-jacent est un proxy hibernate et, dans l'affirmative, appliquez la conversion, puis renvoyez le résultat de la conversion. Ainsi, vous obtiendrez toujours l'objet réel lorsque le getter est appelé mais pourrait toujours bénéficier de chargement paresseux. Vous devriez tester cela à fond, bien que ... p>
Y a-t-il une voie portable (JPA) pour y parvenir? Peut-il être automatisé?
Vous utilisez La raison principale d'un Vous devez donc vérifier votre Modules d'application Ou utilisez un autre serveur d'applications avec chargement de classe standard. P> jboss code> avec les chargeurs de modules. p>
ClasscastException code> avec des proxies est que
Le proxy (généré par
hibernate code>) utilise une instance différente de la classe d'état comme appelant (client). Il doit y avoir deux instances de votre classe d'état dans le même Java JM!
jboss code> gère avec des modules et des dépendances impitoyables / exportations / exportations entre modules. P>
Peu de choses pour étendre Robert Petermeier Répondre. Pour cette construction: car Donc, vous pouvez déballer de manière proxy pour chaque Enfin, j'ai trouvé une solution transparente pour éviter l'instrumentation Bytecode - dans l'énorme système, nous ne saurions toujours pas ce qui ne fonctionne plus après avoir ajouté cette instrumentation, ainsi que après avoir ajouté du code déballé manuellement :) Vous pouvez appliquer un truc simple pour déballer le proxy manuellement dans le getter. Voici mon exemple: p> et ici sont des explications plus détaillées sur le problème. P> P> geoarea.parent code> est un proxy paresseux, créant ce proxy hibernate ne sait pas ce qui sera la classe réelle chargée dans ce champ. Il connaît seulement qu'il sera de
Geoarea Code> Sous-classe. Donc, cela crée une proxy javaassist à
Geoarea Code> Classe qui ne sera jamais istable à
État code> ou à tout sous-type différent de
Geoarea code>. P>
d'une instance de code> d'utilisation ou de type de moulage, mais ce n'était pas une option pour moi (j'ai fabriqué des associations de lots paresseux dans un grand système pour améliorer la performance de la base de données - être 100 % sûr si le système fonctionne toujours, j'aurais besoin d'ajouter du déballement partout, je peux voir le type Cast ou
instance de code>). Mais vous avez une option pour l'automatiser en utilisant
Instrumentation Bytecode . P>