2009-12-14 22 views
8

He leído varios artículos en la web, pero parecen bastante dispersos en este punto. Exactamente qué debo hacer en mi configuración y en mi método para obtener la sesión de hibernación. Estoy tratando de hacer algunas llamadas sql directas para procedimientos almacenados. Tengo una gran base de código que transfiero desde Ruby con muchos métodos estáticos y llamadas a procedimientos almacenados. Si necesito usar sessionFactory, ¿cómo puedo acceder a él?En Grails, ¿cómo accedo a la sesión de hibernación dentro de un método estático de clase de dominio?

Respuesta

24

Desde un método estático se puede tirar el grano sessionFactory del contexto de aplicación:

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

Gracias Burt. Voy a intentar esto. – Andrew

+8

ApplicationHolder ahora está en desuso, ¿hay una metodología de actualización para esto? –

+1

'import grails.util.Holders' importará el titular estático no obsoleto y luego' Holders.grailsApplication.mainContext.sessionFactory' le dará un control sobre sessionFactory. – pendext

20

Si está en un servicio o controlador, sólo tiene que declarar sessionFactory

def sessionFactory

tener que inyectarse. Después de eso, puede consultar

sessionFactory.currentSession 

para usarlo.

Consulte el plugin hibernate-filter (archivo HibernateFilterGrailsPlugin.groovy) para saber cómo inyectar un montón de métodos que usan la sesión.

+1

estoy buscando específicamente la forma de obtenerlo de un método estático de clase de dominio. No quiero tener que obtener la sesión del controlador y pasarla a los métodos. Eso es tan 1990s ' – Andrew

+0

Intenté esto con Grails 2.1 y la fábrica de la sesión no parece ser inyectada en el servicio. El método de Burt anterior parece funcionar todavía. –

+0

He probado esto ahora en 2.2.3 y funciona correctamente. –

11

Usted puede utilizar withSession

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

More info

+0

Esto no parece darte la sesión completa de Hibernate, sino que es una sesión de Grails. que le faltan algunos métodos ('createSQLQuery' por ejemplo) –

+0

Esto no parece ser un comentario lleno de verdad. La sesión no es una sesión de "Grails", es una sesión de Hibernate. Es bastante fácil de determinar; reemplace 'session.clear()' con 'println session.getClass(). name' y es muy probable que vea' org.hibernate.internal.SessionImpl' en la salida –

Cuestiones relacionadas