首先,grails的文档解释withNewSession如下:
https://grails.github.io/grails-doc/latest/ref/Domain%20Classes/withNewSession.html
Defn:提供一种在新Hibernate会话的上下文中执行代码的方法,该会话与当前绑定的会话共享相同的事务(JDBC Connection)资源。
我是一名中级用户,所以我对上述定义不满意,尽管我理解Grails如何使用会话。你能提供一个解释
用法的例子吗?Domain.withNewSession { session ->
// do work
}
我会非常感激!
答案 0 :(得分:9)
好的,经过很长一段时间后我回到了自己的问题,我发布的答案是我得到的任何可能会觉得有用的人。
这是一个用newSession理解的简单示例。
def c = null
Event.withNewSession{
c = Event.first()
}
c.name = "Test"
println c.save()
上述代码会导致异常。 c是一个域对象,但由于它在newsession块中被查询,因此它只与该新会话相关联。
抛出的异常是
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
这是调用.save()时抛出异常的原因。
def c = null
Event.withNewSession{
c = Event.first()
}
println c.isAttached()
得到的输出是
false
因此,您可以看到域与旧会话分离。这是withnewsession的一种用法。 Withnewsession将创建一个新会话,因此在withnewsession块中查询的任何域将仅附加到此新会话,并在退出newsession块后将被分离。