如何实现只读控制器动作



我有一个Order域类(hasMany = [items: Item])和一个编辑屏幕,可以让您编辑Order的实例。

编辑屏幕有totalCost字段,这是通过ajax计算items被添加/删除。totalCost的后端计算是复杂的(不能在前端完成,必须在后端完成),它取决于:

  • 编辑屏幕上未保存更改的状态
  • 正在编辑的order的属性不在编辑屏幕上

因此,为了执行totalCost计算,我这样做:

def ajaxCalculateTotalCost() {
    def order = Order.get(params.id)
    order.properties = params
    def totalCost = // complex calculation based on params.items, logged in user and so on...
    // return totalCost as JSON here
}

这样做的问题是,一旦ajax调用ajaxCalculateTotalCost(),正在编辑的Order实例将被保存。据我所知,Spring或Hibernate在HTTP请求结束时刷新会话??

这是一个问题,如果用户已经添加/删除了items,不能取消他们的更改点击Cancel在表单的底部(Order得到保存时,ajax调用发生)。

有没有人建议如何在不保存Order实例的情况下进行计算?

read代替get

def order = Order.read(params.id)

并将控制器动作标记为@Transactional(readOnly=true)

另一种选择是将计算移到service class中,并将服务方法标记为@Transactional(readOnly=true)

按照@saw303说的做,或者执行order.discard()告诉Hibernate不要保存该对象

相关内容

  • 没有找到相关文章

最新更新