我有一个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不要保存该对象