我使用的是CXF插件版本2.0.1,并在SOAP服务方法中简单使用了GORM。当我对服务运行测试时,它会抛出一个异常,说它无法初始化代理,因为没有会话。根据我做的一些搜索,这是一个Hibernate问题,我假设这意味着GORM尚未正确初始化。有人可以给我一个关于如何在端点类中手动初始化GORM的指针吗?
答案 0 :(得分:1)
您已经习惯在控制器操作(或从那里调用的方法)中执行Hibernate工作,并且那里总是有一个活跃的Hibernate会话,因为Grails在View模式中使用Open Session,在请求的开头,将它绑定在ThreadLocal中,以便可以方便地访问它,然后在请求结束时刷新和关闭会话。有些插件也可以这样做,例如Quartz插件使用作业开始/停止监听器来做同样的事情,这样你就可以像控制器一样方便地使用GORM。
确保会话在代码块期间打开的最简单方法是在任何域类上使用静态withTransaction
方法。它确实启动了一个交易,所以如果你进行数据库更新,你也会从中受益,但即使你只是阅读它也是要走的路,因为会话将是开放的,你就是这样做的。能够使用延迟加载的1-many和many-many引用。
事务/会话与域类无关,因此选择一个随机的并使用它:
User.withTransaction {
def games = Game.findAllByFooAndBar(foo, bar)
games.each { ... }
...
}