gpt4 book ai didi

grails - @Transactional不适用于所有 Controller Action

转载 作者:行者123 更新时间:2023-12-02 14:10:23 25 4
gpt4 key购买 nike

从Grails 3.1.11更新到3.2.0后,我们注意到 Controller 的一项操作不再起作用:

@Transactional(readOnly = true)
class RoomPlanController {
...
def show(RoomPlan roomPlan) {
...
}
def getRooms(RoomPlan roomPlan) {
...
}
}

问题在于,当我们调用 roomPlan/getRooms/1roomPlan为null。如果我们使用相同的参数roomModel调用 show操作,则设置正确。

在 Controller 内部调用 getErrors()会给我们以下错误消息:

Could not obtain current Hibernate Session; nested exception is org.hibernate.HibernateException: No Session found for current thread



它的源于grails.artefact.Controller.initializeCommandObject。经过更多调试后,我注意到 showgetRooms之间的堆栈跟踪有所不同
show的堆栈跟踪:
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的堆栈跟踪:
getRooms:109, RoomPlanController (at.byte_code.businessSuite.hotel)
getRooms:-1, RoomPlanController (at.byte_code.businessSuite.hotel)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)

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

我们无法在任何其他 Controller 中看到该问题,也无法在一个小型测试项目中重现该问题。我们已经尝试过重建该项目,而且还没有在一个全新的工作站上进行过重建。

有人看到过这样的问题吗?

最佳答案

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

默认情况下,Grails Controller 为readOnly。您可以简单地从 Controller 中删除注释。

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

关于grails - @Transactional不适用于所有 Controller Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39932199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com