【问题标题】:How to implement a read only controller action如何实现只读控制器动作
【发布时间】:2014-08-25 11:45:29
【问题描述】:

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

编辑屏幕有 totalCost 字段,该字段是通过 ajax 计算的,因为添加/删除了 itemstotalCost的后端计算比较复杂(前端不能做,必须后端做),取决于:

  • 编辑屏幕上未保存更改的状态
  • 正在编辑的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
}

问题在于,一旦对ajaxCalculateTotalCost() 进行了ajax 调用,正在编辑的Order 实例就会被保存。据我了解,Spring 或 Hibernate 在 HTTP 请求结束时刷新会话???

这是一个问题,好像用户添加/删除了items,但无法通过单击表单底部的Cancel 取消更改(发生ajax 调用时Order 已保存)。

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

【问题讨论】:

    标签: grails grails-orm domain-object


    【解决方案1】:

    使用read 代替get

    def order = Order.read(params.id)
    

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

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

    【讨论】:

      【解决方案2】:

      按照@saw303 所说的或按照order.discard() 告诉Hibernate 不要持久化该对象

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-19
        • 2011-03-19
        • 2014-10-28
        • 2011-04-24
        • 1970-01-01
        • 1970-01-01
        • 2018-02-24
        • 2020-05-09
        相关资源
        最近更新 更多