Hibernate Grails CXF插件和GORM

Hibernate Grails CXF插件和GORM,hibernate,grails,Hibernate,Grails,我使用的是CXF插件版本2.0.1,并且在SOAP服务方法中简单使用了GORM。当我在服务上运行测试时,它抛出一个异常,表示它无法初始化代理,因为没有会话。根据我做的一些搜索,这是一个Hibernate问题,我假设这意味着GORM尚未正确初始化。有人能给我一个关于如何在endpoint类中手动初始化GORM的指针吗 您习惯于在控制器操作(或从那里调用的方法)中执行Hibernate工作,并且那里总是有一个活动的Hibernate会话,因为Grails使用视图模式中的Open Session,在请

我使用的是CXF插件版本2.0.1,并且在SOAP服务方法中简单使用了GORM。当我在服务上运行测试时,它抛出一个异常,表示它无法初始化代理,因为没有会话。根据我做的一些搜索,这是一个Hibernate问题,我假设这意味着GORM尚未正确初始化。有人能给我一个关于如何在endpoint类中手动初始化GORM的指针吗

您习惯于在控制器操作(或从那里调用的方法)中执行Hibernate工作,并且那里总是有一个活动的Hibernate会话,因为Grails使用视图模式中的Open Session,在请求开始时打开会话,将其绑定到ThreadLocal中以便方便地访问,然后在请求结束时刷新并关闭会话。一些插件也可以这样做,例如Quartz插件使用作业开始/停止侦听器来做同样的事情,因此您可以像在控制器中一样方便地使用GORM

确保会话在代码块期间处于打开状态的最简单方法是在任何域类上使用static
withTransaction
方法。它确实会启动一个事务,因此,如果您进行数据库更新,您也会从中受益,但即使您只是在阅读它,这也是一种方法,因为会话将是打开的,您将能够处理延迟加载的1-many和many-many引用

事务/会话与域类无关,因此选择一个随机类并使用它:

User.withTransaction {

   def games = Game.findAllByFooAndBar(foo, bar)
   games.each { ... }
   ...
}