首先,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)
我会很感激的!
好吧,经过很长一段时间后,我回到了自己的问题,我发布的答案是我得到的任何可能会觉得有用的人.
这是一个用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块后将被分离.
| 归档时间: |
|
| 查看次数: |
3778 次 |
| 最近记录: |