首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不应用于所有控制器操作的事务处理

不应用于所有控制器操作的事务处理
EN

Stack Overflow用户
提问于 2016-10-08 12:11:42
回答 1查看 603关注 0票数 2

在从Grails 3.1.11到3.2.0的更新之后,我们注意到控制器的一个操作不再起作用:

代码语言:javascript
复制
@Transactional(readOnly = true)
class RoomPlanController {
    ...
    def show(RoomPlan roomPlan) {
        ...
    }
    def getRooms(RoomPlan roomPlan) {
        ...
    }
}

问题是,当我们调用roomPlan/getRooms/1时,roomPlan是空的。如果我们调用具有相同参数的show操作,则roomPlan设置是正确的。

控制器中的getErrors()调用将给出以下错误消息:

无法获得当前Hibernate会话;嵌套异常为org.hibernate.HibernateException:未为当前线程找到会话

它起源于grails.artefact.Controller.initializeCommandObject.经过进一步的调试,我注意到showgetRooms之间的堆栈跟踪有一个不同之处

show的堆栈跟踪

代码语言:javascript
复制
show:100, RoomPlanController (at.byte_code.businessSuite.hotel)
$tt__show:-1, RoomPlanController (at.byte_code.businessSuite.hotel)
doCall:-1, RoomPlanController$_show_closure13 (at.byte_code.businessSuite.hotel)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)

getRooms的堆栈跟踪

代码语言:javascript
复制
getRooms:109, RoomPlanController (at.byte_code.businessSuite.hotel)
getRooms:-1, RoomPlanController (at.byte_code.businessSuite.hotel)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)

错误消息和不同的堆栈跟踪让我们假设它与数据库会话/事务有关,在将@Transactional(readOnly = true)添加到操作之后,一切都按预期工作,并在Grails3.2.0更新之前工作。如果我们删除注释并再次失败。

我们无法在任何其他控制器中看到这个问题,也无法在一个小的测试项目中再现它。我们已经尝试重建这个项目,也在一个全新的工作站上,我们没有。

还有人注意到这样的问题吗?

EN

回答 1

Stack Overflow用户

发布于 2016-10-10 15:47:32

我认为您甚至不需要在控制器中使用@Transactional(readOnly = true)。

Grails控制器在默认情况下是readOnly。您可以简单地从控制器中删除注释。

相反,Grails服务类在默认情况下是事务性的。如果需要调用save()方法,则更需要在服务类中调用该方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39932199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档