Au Printemps avec jpa/hibernate, comment faire pour garder une session ouverte pour éviter l'initialisation tardive des exceptions?
Je suis actuellement la marque de collections dans les beans entité comme désireux d'éviter d'obtenir une initialisation exception lorsque j'essaie d'accéder à la collection des propriétés après le chargement du bean avec l'EntityManager.
Si je au lieu de laisser la collection chargement paresseux, comment faire pour garder une session ouverte? J'ai pensé à essayer @Transactional, mais même si ça marche, je ne veux pas le faire, car il ne semble pas le droit de quitter une transaction ouverte sur une longue méthode.
Vous devez vous connecter pour publier un commentaire.
https://www.hibernate.org/43.html
Fondamentalement, vous avez quelques options.
-Vous pouvez utiliser le bouton "open session in view" modèle où vous utilisez un filtre/intercepteur/AOP de style logique pour ouvrir une session lorsque le serveur côté de la logique commence et le fermer quand il est de travers.
-Vous pu mettre en œuvre les conversations s'étendant sur plusieurs requête-réponse cycles.
Un bon vieux Filtre de Servlet est le plus simple.
Une dernière option qui semble d'été manquée est que vous pouvez construire votre objet graphique en fonction de votre cas d'utilisation en utilisant une JOINTURE.
Cette volonté résultat dans l'objet en cours d'initialisation, j'.e la volonté de ne pas être un proxy.
Utilisez cette méthode si vous êtes dans le contrôle de la client (j'.e vous ne créant pas d'ouvrir un service de publication d'une api) parce que vous avez besoin de savoir dans quel état est le fait d'être touché lorsque la session est fermée, parce que la transaction a fermé.
Comme d'autres l'ont dit, vous devriez lire sur "open session in view" modèle, l'idée de base est d'avoir une session hibernate ouvert pour la durée totale de traitement de la requête http. Il y a deux hibernate spécifique et printemps solutions - j'ai utilisé du printemps avant et il fonctionne très bien.
Dans la question, vous mentionnez que vous ne voulez pas avoir de transaction ouvert pendant une longue période. Pour la plupart des gens ce n'est pas un problème parce que chaque demande est traitée assez rapidement. Cependant, si dans votre cas, il est en effet impossible de ce modèle ne fonctionne pas pour vous. Pouvez-vous expliquer pourquoi vous ne voulez pas les transactions gardés ouverte?
Êtes-vous à l'aide du Printemps HibernateTemplate? Il aura à gérer la session pour vous, je crois. Alternativement, si vous êtes sur Hibernate 3.0.1 ou au-dessus, le Printemps devrait encore être en mesure de gérer la session pour vous.
Il y a un SpringSource l'entrée de blog qui décrit comment configurer cela. J'ai inclus un extrait ci-dessous:
Lorsque vous quittez une session ouverte de lecture des données, vous laissera qu'une opération ouverte. Long de l'exécution de transactions ne sont pas que les grandes d'un problème (même si cela peut dépendre de votre base de données) ce qui cause réellement les problèmes sont les serrures tenir pendant une longue période, mais ils obtiennent seulement créé une fois que vous en changer les données dans la base de données. De nouveau, cela dépend de votre base de données.
Maintenant, je n'ai pas utilisé le Printemps, mais j'ai utilisé Hibernate dans plusieurs projets différents. L'approche que j'ai réglé sur le plus récent projet est né de la Défensive, Le Gestionnaire De Session modèle (en conjonction avec un filtre de servlet), et nous sommes heureux avec elle. Vous pouvez trouver plus de modèles de conception ici.