与Grails中的NewSession一起理解

kof*_*rts 3 grails hibernate

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

https://grails.github.io/grails-doc/latest/ref/Domain%20Classes/withNewSession.html
Run Code Online (Sandbox Code Playgroud)

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

我是一个中级grails用户,所以我不熟悉上面的定义虽然我理解grails如何使用会话.你能提供一个解释使用的例子

Domain.withNewSession { session ->
    // do work
}
Run Code Online (Sandbox Code Playgroud)

我会很感激的!

kof*_*rts 9

好吧,经过很长一段时间后,我回到了自己的问题,我发布的答案是我得到的任何可能会觉得有用的人.

这是一个用newSession理解的简单示例.

def c = null

Event.withNewSession{

  c = Event.first()

}

c.name = "Test"
println c.save()
Run Code Online (Sandbox Code Playgroud)

上面的代码会导致异常.c是一个域对象,但由于它在newsession块中被查询,因此它只与该新会话相关联.

抛出的异常是

org.hibernate.LazyInitializationException: could not initialize proxy - no Session
Run Code Online (Sandbox Code Playgroud)

以下是调用.save()时抛出异常的原因.

def c = null

Event.withNewSession{

  c = Event.first()

}

println c.isAttached()
Run Code Online (Sandbox Code Playgroud)

得到的输出是

false
Run Code Online (Sandbox Code Playgroud)

因此,您可以看到域与旧会话分离.这是withnewsession的一种用法.Withnewsession将创建一个新会话,因此在withnewsession块中查询的任何域将仅附加到此新会话,并在退出newsession块后将被分离.