J'ai lu divers articles sur le web, mais ils semblent plutôt dispersés sur ce point. Exactement ce que j'ai besoin de faire dans ma configuration et dans ma méthode pour obtenir la session d'hibernation. J'essaye de faire des appels sql directs pour des procédures stockées. J'ai une base de code importante que je porte de Ruby avec beaucoup de méthodes statiques et des appels de procédures stockées. Si j'ai besoin d'utiliser la sessionFactory, comment y accéder?Dans Grails, comment puis-je accéder à la session d'hibernation à l'intérieur d'une méthode statique de classe de domaine?
Répondre
A partir d'une méthode statique vous pouvez tirer la fève sessionFactory du contexte d'application:
import org.codehaus.groovy.grails.commons.ApplicationHolder as AH
...
def ctx = AH.application.mainContext
def sessionFactory = ctx.sessionFactory
def session = sessionFactory.currentSession
Si elle est dans un service ou d'un contrôleur, il vous suffit de déclarer sessionFactory
def sessionFactory
pour avoir injecté. Après cela, vous pouvez vous référer à
sessionFactory.currentSession
pour l'utiliser.
Découvrez le plugin hibernate-filter (fichier HibernateFilterGrailsPlugin.groovy) pour savoir comment injecter un tas de méthodes utilisant la session.
Je spécifiquement à la recherche comment l'obtenir à partir d'une méthode statique de classe de domaine. Je ne veux pas avoir à obtenir la session du contrôleur et la passer dans les méthodes. C'est ainsi que les années 90 ' – Andrew
J'ai essayé ceci avec Grails 2.1 et l'usine de session ne semble pas être injectée dans le service. La méthode de Burt ci-dessus semble toujours fonctionner. –
J'ai testé cela maintenant sur 2.2.3 et cela fonctionne correctement. –
Cela ne semble pas vous donner la session Hibernate complète, mais plutôt une session Grails, qui manque quelques méthodes ('createSQLQuery' par exemple) –
Cela ne semble pas être un commentaire plein de vérité. La session n'est pas une session "Grails", c'est une session Hibernate. C'est assez facile à déterminer. remplacez 'session.clear()' par 'println session.getClass(). name' et vous risquez de voir' org.hibernate.internal.SessionImpl' dans la sortie –
Merci Burt. Je vais essayer cela. – Andrew
ApplicationHolder est maintenant obsolète, existe-t-il une méthodologie de mise à jour pour cela? –
'import grails.util.Holders' va importer le support statique non obsolète, puis' Holders.grailsApplication.mainContext.sessionFactory' vous donnera un handle sur la sessionFactory. – pendext