我有一个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()
进行ajax调用,就会保存正在编辑的Order
实例。据我所知,Spring或Hibernate在HTTP请求结束时刷新会话???
这是一个问题,好像用户已添加/删除items
,无法通过点击表单底部的Cancel
取消更改(Order
在ajax时已保存呼叫发生了。)
有人可以建议如何在不保存Order
实例的情况下执行计算吗?
答案 0 :(得分:2)
使用read
代替get
。
def order = Order.read(params.id)
并将控制器操作标记为@Transactional(readOnly=true)
。
另一种选择是将计算移到service class
并标记服务方法@Transactional(readOnly=true)
答案 1 :(得分:0)
执行@ saw303说或做order.discard()
告诉Hibernate不持久保存该对象