-
abr09
Obteniendo el contexto de persistencia (inglés)
publicado por Carlos Rico Avendaño en Grails
307 visitas -
mar19
Retrasar la creación de la SessionFactory en Grails (inglés)
publicado por Enrique Medina Montenegro en Grails
269 visitas -
sep23
¿Cómo funciona el contexto de persistencia en Grails? (inglés)
publicado por Enrique Medina Montenegro en Grails
655 visitas
SQ34 – Avanzado – ¿Y si no tengo contexto transaccional?
publicado por Enrique Medina Montenegro
Enrique Medina Montenegro
Con más de 14 años de experiencia en el mundo de las TI, donde comenzó desarrollando aplicaciones de escritorio en Delphi o Visual Basic, este Ingeniero en Informática por la Universidad de Alicante (1991-1996) ha ido perfilando su actividad profesional hacia las arquitecturas J2EE, donde siempre ha seguido muy atento, e incluso colaborado en ocasiones, con proyectos open-source como MyFaces, Spring, Hibernate, Groovy o Grails. Ocupando puestos desde Programador Junior hasta Arquitecto Senior de Soluciones, Enrique ha sido testigo de cómo ha ido evolucionando la tecnología en torno al desarrollo de aplicaciones web, adquiriendo un conocimiento y experiencia que le permiten evaluar con detalle las necesidades de cada proyecto y aplicar las herramientas que maximizan su productividad. Actualmente, Enrique se ha especializado en el framework de desarrollo Grails, y ejerce la Dirección Técnica de proyectos basados, entre otras, en esta tecnología.
¿Sabías que… puedes gestionar manualmente el contexto transaccional en aquellas ocaciones en que no dispongas de uno de forma automática?
Puede parecer algo farragoso de describir en la pregunta anterior, pero imaginemos un caso de uso bien simple. Tenemos una etiqueta en nuestro “taglib” que precisa de acceso a datos, pero esta etiqueta se llama en un GSP que se pinta directamente, sin pasar por un controlador. Esto es un ejemplo típico de una “home page”, o página inicial de un sitio web.
Al no pasar la petición a través de un controlador, Grails no inicia un contexto transaccional (no crea una sesión de Hibernate y la une al “thread” de la petición), por lo que al intentar acceder a datos desde la etiqueta, nos dará un error bastante desagradable a primera vista:
Caused by: org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here at org.springframework.orm.hibernate3.LocalSessionFactoryBean$TransactionAwareInvocationHandler.invoke( LocalSessionFactoryBean.java:1113) at $Proxy26.getCurrentSession(Unknown Source) at ........
Tras este mensaje se oculta el problema de que Grails no encuentra ninguna sesión de Hibernate activa en el contexto transaccional, por lo que no puede gestionar el acceso a datos. ¿Cómo lo solucionamos? Pues bien, hay que manualmente crear esa sesión y “unirla” al contexto transaccional, así:
def sessionFactory = grailsApplication.mainContext.getBean("sessionFactory")
def session = SessionFactoryUtils.getSession(sessionFactory, true)
try {
TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session))
}
catch (e) {
// Si no puede es porque ya tiene una... Lo ignoramos...
}
El “try..catch” es una licencia que me he permitido porque en la clase TransactionSynchronizationManager no he visto ningún método que detecte si hay una sesión de Hibernate en general, y para evitar que si ya hay alguna, Hibernate proteste por la duplicidad.
Recuerda: Grails hace muchas cosas por ti sin que tú tengas que preocuparte, pero en ocasiones debes ser tú mismo quien indique a tu aplicación cómo hacer ciertas cosas.


(10 votos, media: 4,90)
Entradas relacionadas
(3 votos, media: 3,67)
Comentarios recientes