grails withSession和当前的hibernate会话

时间:2013-05-23 09:47:00

标签: hibernate session grails

我在Grails中的withSession和当前的hibernate会话之间感到困惑。

我的问题是:我们在闭包中访问的会话对象是否与当前的hibernate会话对象相同?

我写了一个服务,其操作如下:

def strangeBehavior(){

    Link.withSession { session->
        println "link current session " +  session.hashCode()
    }

    Task.withSession { session->
        println "task current session " +  session.hashCode()
    }

    Project.withSession { session->
        println "project current session " +  session.hashCode()
    }

    UserStory.withSession { session->
        println "user story current session " +  session.hashCode()
    }

    def ctx = AH.application.mainContext
        def sessionFactory = ctx.sessionFactory
        def tmp = sessionFactory.currentSession
        println " current session " +  tmp.hashCode()
    }
}

对我来说奇怪的是有5种不同的哈希码...如果我打印5个会话对象,我会看到相同的toString()结果。这让我猜他们有相同的内容:

  

SessionImpl(PersistenceContext [entityKeys = [的EntityKey [com.astek.agileFactory.Link#170],   的EntityKey [com.astek.agileFactory.Project#9],collectionKeys = [科尔......“

1 个答案:

答案 0 :(得分:4)

简要回答你的问题:
我们在闭包中访问的会话对象是当前的hibernate会话。

会话对象是当前hibernate会话的代理。因此在每种情况下都有不同的哈希码。

查看source of withSessionHibernateTemplatesetExposeNativeSession被设置为false(默认值也为false),这样可确保始终返回会话代理而不暴露本机休眠会话。