Observatorio de Grails 
  • Inicio
  • Actualidad
  • Artículos
  • Tutoriales
  • Eventos
  • Foro
  • Acerca de
SQ33 – Básico – Organiza tus ficheros i18n Gran éxito de la conferencia Greach 2011
abr 29

SQ34 – Avanzado – ¿Y si no tengo contexto transaccional?

publicado por Enrique Medina Montenegro

0 comentarios
1.168 visitas
(10 votos, media: 4,90)

Enrique Medina Montenegro

Twitter  |  LinkedIn

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.

Del.icio.us Facebook LinkedIn Twitter

Escribir un comentario

Clic para cancelar respuesta.

Actualidad  Entradas relacionadas  si te ha interesado la entrada te proponemos otras lecturas relacionadas

  • abr09

    Obteniendo el contexto de persistencia (inglés)

    publicado por Carlos Rico Avendaño en Grails

    0 comentarios
    307 visitas
    (3 votos, media: 3,67)
  • mar19

    Retrasar la creación de la SessionFactory en Grails (inglés)

    publicado por Enrique Medina Montenegro en Grails

    0 comentarios
    269 visitas
    (2 votos, media: 1,00)
  • sep23

    ¿Cómo funciona el contexto de persistencia en Grails? (inglés)

    publicado por Enrique Medina Montenegro en Grails

    0 comentarios
    655 visitas
    (1 votos, media: 5,00)

Comentarios recientes  Comentarios recientes

  • pedro luis hola como cargo imágenes de un archivo para mostrarlo en un reporte con los demás datos; en Reportes en Grails con iReport
    17/05/2012 a las 21:03

  • yo 123; en Clusterizar una aplicación Grails con EhCache (inglés)
    24/04/2012 a las 17:33

  • yo muy buebo; en Clusterizar una aplicación Grails con EhCache (inglés)
    24/04/2012 a las 17:21

Twitter  

preload preload preload

Síguenos en Twitter  |  Facebook
Inicio  |  Actualidad  |  Artículos  |  Tutoriales  |  Eventos  |  Foro  |  Acerca de

© 2010 Observatorio de Grails. Todos los derechos reservados.