hibernate - 在 Grails 中用 NewSession 理解

标签 hibernate grails

首先 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/

相关文章:

java - 如何在单个 Controller 中制作多个@PatchMapping?

java - 在 Struts 2、Hibernate 中使用数据库值填充下拉列表

从 war 运行时,grails 占位符未在外部配置文件中解析

sql-server - Grails域更新与数据库触发器更新

grails - grails独特的投影获取不同项目的结果计数

jquery - Twitter Bootstrap 下拉菜单在部署时不起作用

java - Hibernate 三重多对多连接

java - Spring Jpa : change FetchType for entity

java - JPA:通过不同的列选择任何行

grails - Grails如何处理动态类重载