如何实现只读控制器操作

时间:2014-07-04 07:45:13

标签: grails gorm domain-object

我有一个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取消更改(Order在ajax时已保存呼叫发生了。)

有人可以建议如何在不保存Order实例的情况下执行计算吗?

2 个答案:

答案 0 :(得分:2)

使用read代替get

def order = Order.read(params.id)

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

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

答案 1 :(得分:0)

执行@ saw303说或做order.discard()告诉Hibernate不持久保存该对象