Comment cnvert Hibernate procuration à une entité réelle de l'objet
Au cours d'une Hibernate Session
, je suis le chargement de certains objets et certains d'entre eux sont chargés de procurations dues à chargement différé. Tout est OK et je ne veux pas tourner le chargement paresseux off.
Mais plus tard, j'ai besoin d'envoyer des objets (en fait, un seul objet) à l'GWT client via RPC. Et il se trouve que cette objet concret est un proxy. J'ai donc besoin de le transformer en un objet réel. Je ne peux pas trouver une méthode comme "matérialiser" dans Hibernate.
Comment transformer certains objets de procurations de reals, connaissant leur classe et ID?
Pour le moment la seule solution que je vois est d'expulser l'objet de mise en veille prolongée du cache et de le recharger, mais il est vraiment mauvais pour de nombreuses raisons.
Vous devez vous connecter pour publier un commentaire.
Voici une méthode que j'utilise.
HibernateProxy
définit unwriteReplace
méthode pour forcer les développeurs à faire quelque chose de spécial au cours de la sérialisation.Hibernate.initialize(Object)
implicitement vérifie si l'objet a été initialisée avant?Hibernate.initialize(entity)
charge complète de l'objet graphique pour cette entité de la base de données. Mais que faire si juste de la vraie classe avec l'id défini pour chaque proxy est nécessaire. Cela semble plus compliqué.NullPointerException
de le corps de la méthode. N'est-ce pas implique dans un autreif-null
de validation, soit un supplément detry-catch
bloc? Un autre point est la suivante: si l'entité est null, ` mise en veille prolongée.initialiser(entité)", elle va jeter un NPE. Qu'en pensez-vous?(T)Hibernate.unproxy(entity)
Comme je l'ai expliqué dans cet article, depuis l'ORM Hibernate 5.2.10, vous pouvez le faire likee ce:
Avant Hibernate 5.2.10. la façon la plus simple de le faire est d'utiliser les unproxy méthode offerts par Hibernate interne
PersistenceContext
mise en œuvre:J'ai écrit le code suivant qui nettoie objet de procurations (si elles ne sont pas déjà initialisé)
J'utilise cette fonction sur la suite de mes services RPC (via) et il nettoie de façon récursive tous les objets de résultat à partir des procurations (si elles ne sont pas initialisées).
Essayez d'utiliser
Hibernate.getClass(obj)
La façon dont je recommande avec JPA 2 :
Avec Spring Data JPA et Hibernate, j'ai été à l'aide des sous-interfaces de
JpaRepository
pour rechercher des objets appartenant à une hiérarchie de type qui a été cartographié à l'aide de la "jointure" de la stratégie. Malheureusement, les requêtes sont de retour procurations de type de base à la place d'instances de la devrait types de béton. Cela m'empêchait de lancer des résultats pour les types appropriés. Comme vous, je suis venu ici à la recherche d'un moyen efficace pour obtenir mon entités unproxied.Vlad a la bonne idée pour unproxying ces résultats; Yannis fournit un peu plus de détails. L'ajout, dans leurs réponses, voici le reste de ce que vous pourriez être à la recherche pour:
Le code suivant fournit un moyen facile de unproxy votre proxy entités:
Vous pouvez transmettre unproxied entités ou entités mandatées pour la
unproxy
méthode. Si elles sont déjà unproxied, ils vont tout simplement être retournés. Sinon, ils vont se unproxied et retourné.Espérons que cette aide!
L'autre solution est d'appeler
Juste avant la fermeture de la session.
J'ai trouvé une solution pour deproxy une classe en utilisant le standard de Java et l'API JPA. Testé avec mise en veille prolongée, mais ne nécessite pas d'hiberner comme une dépendance et devrait fonctionner avec tous les fournisseurs JPA..
Onle une exigence, il est nécessaire de modifier la classe parent (Adresse) et ajouter une simple méthode d'assistance.
Idée générale: ajout de la méthode d'assistance à la classe parent qui renvoie lui-même. lorsque la méthode est appelée sur le proxy, il transfère l'appel réel de l'instance et le rendement réel de l'instance.
Mise en œuvre est un peu plus complexe, que la mise en veille reconnaît que proxy classe renvoie lui-même et renvoie toujours proxy au lieu d'un vrai exemple. Solution de contournement consiste à envelopper retourné instance dans une simple classe wrapper, qui a différent type de classe que la véritable instance.
Dans le code:
De jeter Adresse proxy réel sous-classe, l'utilisation suivantes:
Merci pour les solutions proposées! Malheureusement, aucun d'entre eux travaillaient pour mon cas: la réception d'une liste de CLOB objets de base de données Oracle via JPA - Hibernate, à l'aide d'une requête native.
Toutes les approches proposées m'a donné une ClassCastException ou juste de rentrer Proxy java objet (qui profondément à l'intérieur de contenus souhaités Clob).
Donc ma solution est la suivante (basée sur plusieurs méthodes ci-dessus):
Espère que cela va aider quelqu'un!
À partir de Hiebrnate 5.2.10 vous pouvez utiliser Mise en veille prolongée.proxy méthode pour convertir un proxy pour votre entité réelle: