2009-08-25 8 views
1

Je suis assez nouveau au printemps, et j'aimerais comprendre un peu plus sur les sessions. J'ai mappé une base de données héritée avec des entités annotées Hibernate et construit deux objets de service à récupérer, récupérer etc. Mes entités contiennent également d'autres entités (mappées via des clés étrangères) et des ensembles d'entités. Quand je traverse le graphe d'entitiy dans mes services, je n'ai aucun problème. Mes services ont été enveloppés dans un TransactionProxyFactoryBean, donc tout devrait être bon. Donc, dans mon View Controller, je demande un tas d'entités à partir des services. Mais quand je parcours le graphe d'entité dans mon contrôleur de vue (par exemple pour afficher le nom du pays de l'utilisateur, l'état et le pays étant des entités paresseusement chargées), la session Hibernate est déjà fermée et je reçois une "LazyInitializationException: ne peut pas initialiser proxy - Je ne voudrais pas que mes services récupèrent les données avec impatience, cela consomme beaucoup de RAM car mes graphiques sont profonds et peuvent même avoir des références circulaires. Je ne veux pas non plus avoir à toucher explicitement aux parties que je vais afficher dans les services, car cela signifierait que je devrais copier/coller des services similaires à plusieurs reprises. Donc ce que je veux, c'est que la session Hibernate soit toujours ouverte quand je suis dans mon contrôleur de vue et ne ferme pas la session tant que la vue n'a pas été servie. Que puis-je faire pour le garder ouvert?Sessions de base de données au printemps

Mon vue bean ressemble à ceci, est-il possible d'y injecter mon bean dérivé de TransactionProxyFactoryBean?

<bean name="/" class="example.SimpleViewController"> 
    <property name="userService" ref="userService"/> 
    <property name="catalogService" ref="catalogService"/> 
    </bean> 

Vive

Nik

Répondre

1

Voir ma réponse à cette question: In Spring with jpa/hibernate, how do I keep a session open to avoid lazy initialization exceptions?

J'utilise Hibernate sans printemps, donc je ne suis pas sûr à 100% des capacités de printemps doit traiter avec des sessions, mais je crois qu'il a à la fois un filtre intégré et Interceptor. La meilleure façon de gérer les sessions en dehors de JPA est d'écrire un filtre qui ouvre la session avant de passer au reste de votre serveur, puis ferme la session par la suite. Je crois que c'est ce que fait Spring dans les choses.

+0

Problème courant. Ouvrir la session dans un filtre est la voie à suivre. –

0

Vous devez toujours utiliser le modèle de session ouverte en vue pour éviter ce problème particulier, que vous utilisiez Spring ou non; Bien que Spring dispose d'une certaine facilité pour mettre en œuvre le modèle de conception sur certains frameworks tels que Struts ou JSP.

Questions connexes