0

我有一个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
}

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

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

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

4

2 回答 2

2

使用read而不是get.

def order = Order.read(params.id)

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

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

于 2014-07-04T07:53:47.793 回答
0

执行@saw303 所说或执行的操作order.discard()来告诉 Hibernate 不要保留该对象

于 2014-07-06T04:00:36.493 回答