Grails 1.3.5:销毁会话时更新用户表

时间:2010-10-16 18:46:32

标签: grails grails-domain-class

我有HttpSessionListener来监听创建和销毁会话的时间。我有一个用户域,其中有loginIn布尔列,每当用户登录或注销时我都会更新,我用它来管理管理。我还将会话ID存储在数据库中。

我还想在会话被销毁时更新loggedIn列。下面是sessionDestroyed方法中编写的代码。

def user = User.findByUserSessionId(session.getId())
if(user) {      
    user.setLoggedIn(false)
    user.setUserSessionId("SESSION DESTROYED")
    user.save(flush: true)      
 }

问题是用户表永远不会更新。

以下是日志文件中报告的错误:

            [2010-10-16 11:45:07.781] ERROR core.ContainerBase.[Tomcat].[localhost].[/SAMPLE] Session event listener threw exception
        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.SpringSessionContext.currentSession(SpringSessionContext.java:63)
            at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:574)
            at org.codehaus.groovy.grails.orm.hibernate.validation.HibernateDomainClassValidator.validate(HibernateDomainClassValidator.java:66)
            at org.codehaus.groovy.grails.orm.hibernate.metaclass.AbstractSavePersistentMethod.doInvokeInternal(AbstractSavePersistentMethod.java:129)
            at org.codehaus.groovy.grails.orm.hibernate.metaclass.AbstractDynamicPersistentMethod.invoke(AbstractDynamicPersistentMethod.java:59)
            at sun.reflect.GeneratedMethodAccessor500.invoke(Unknown Source)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:597)
            at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoCachedMethodSite.invoke(PojoMetaMethodSite.java:188)
            at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:52)
            at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:132)
            at org.codehaus.groovy.grails.plugins.orm.hibernate.HibernatePluginSupport$_addBasicPersistenceMethods_closure71.doCall(HibernatePluginSupport.groovy:812)

我可以知道会话被销毁时更新用户表的正确方法。

谢谢。 杰伊钱德兰。

1 个答案:

答案 0 :(得分:2)

尝试

User.withTransaction{ txStatus ->    .... }

User.withSession{ session - > .... }

或者可能会注入一个服务来执行您需要它做的事情,因为默认情况下服务方法应该有事务。

编辑 - 通常我不会走这么远,但我今天心情很好......以下情况应该有效。你应该阅读grails文档或买一本书......

User.withTransaction( txStatus -> 
    def user = User.findByUserSessionId(session.getId())
    if(user) {      
       user.setLoggedIn(false)
       user.setUserSessionId("SESSION DESTROYED")
       user.save(flush: true)      
    }
}