2009-12-14 19 views
8

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

24

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 
+0

Merci Burt. Je vais essayer cela. – Andrew

+8

ApplicationHolder est maintenant obsolète, existe-t-il une méthodologie de mise à jour pour cela? –

+1

'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

20

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.

+1

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

+0

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. –

+0

J'ai testé cela maintenant sur 2.2.3 et cela fonctionne correctement. –

11

Vous pouvez utiliser WithSession

Book.withSession { session -> 
    session.clear() 
} 

More info

+0

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) –

+0

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 –