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