我在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 = [科尔......“
答案 0 :(得分:4)
简要回答你的问题:
我们在闭包中访问的会话对象是不当前的hibernate会话。
会话对象是当前hibernate会话的代理。因此在每种情况下都有不同的哈希码。
查看source of withSession,HibernateTemplate中setExposeNativeSession
被设置为false
(默认值也为false),这样可确保始终返回会话代理而不暴露本机休眠会话。