理解Grails中的NewSession

时间:2015-09-01 09:34:19

标签: hibernate grails

首先,grails的文档解释withNewSession如下:

https://grails.github.io/grails-doc/latest/ref/Domain%20Classes/withNewSession.html

Defn:提供一种在新Hibernate会话的上下文中执行代码的方法,该会话与当前绑定的会话共享相同的事务(JDBC Connection)资源。

我是一名中级用户,所以我对上述定义不满意,尽管我理解Grails如何使用会话。你能提供一个解释

用法的例子吗?
Domain.withNewSession { session ->
    // do work
}

我会非常感激!

1 个答案:

答案 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块后将被分离。