2009-12-14 13 views
8

Ho letto vari articoli sul web, ma sembrano piuttosto sparsi su questo punto. Esattamente ciò che devo fare nella mia configurazione e nel mio metodo per ottenere la sessione di sospensione. Sto provando a fare alcune chiamate sql dirette per le stored procedure. Ho una grande base di codice che sto eseguendo il porting da Ruby con molti metodi statici e chiamate di stored procedure. Se ho bisogno di usare sessionFactory, allora come posso accedervi?In Grails come si accede alla sessione di sospensione all'interno di un metodo statico di classe dominio?

risposta

24

Da un metodo statico si può tirare il fagiolo sessionFactory dal contesto di applicazione:

import org.codehaus.groovy.grails.commons.ApplicationHolder as AH 
... 
def ctx = AH.application.mainContext 
def sessionFactory = ctx.sessionFactory 
def session = sessionFactory.currentSession 
+0

Grazie Burt. Farò un tentativo. – Andrew

+8

ApplicationHolder è ora obsoleto, esiste una metodologia di aggiornamento per questo? –

+1

'import grails.util.Holders' importa il Detentore statico non deprecato e quindi 'Holders.grailsApplication.mainContext.sessionFactory' ti darà un handle su sessionFactory. – pendext

20

Se è in un servizio o un controller, è sufficiente dichiarare sessionFactory

def sessionFactory

di averlo iniettato. Dopo di che è possibile fare riferimento a

sessionFactory.currentSession 

per usarlo.

Controllare il plug-in filtro di ibernazione (file HibernateFilterGrailsPlugin.groovy) per come iniettare una serie di metodi che utilizzano la sessione.

+1

sto specificamente alla ricerca come prendilo da un metodo statico di classe dominio. Non voglio dover ottenere la sessione dal controller e trasferirla nei metodi. È lo – Andrew

+0

degli anni '90 che ho provato con Grails 2.1 e il factory di sessione non sembra essere stato iniettato nel servizio. Il metodo di Burt sopra sembra funzionare ancora. –

+0

Ho provato questo ora su 2.2.3 e funziona correttamente. –

11

È possibile utilizzare withSession

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

More info

+0

Questo non sembra darti la piena sessione di Hibernate, invece è una sessione di Grails, a cui mancano alcuni metodi ('createSQLQuery 'ad esempio) –

+0

Questo non sembra essere un commento pieno di verità. La sessione non è una sessione "Grails", è una sessione di Hibernate. È abbastanza facile da determinare; sostituisci 'session.clear()' con 'println session.getClass(). name' e molto probabilmente vedrai' org.hibernate.internal.SessionImpl' nell'output –

Problemi correlati