grails - how to call beforeDelete event when deleting many side element in a one-to-many association? -
i have 1 many association here both domain classes
purchaseorder
class purchaseorder { bigdecimal balance static constraints = { balance nullbale:false } list items static hasmany = [items:item]
}
item
class item { string product integer quantity bigdecimal price def beforeinsert() { def balance = purchaseorder.balance ?: 0 total = price * quantity purchaseorder.balance = balance + total } def beforedelete() { purchaseorder.balance -= total } static belongsto = [purchaseorder:purchaseorder] }
in purchaseorder class field balance, field(balance) needs calculated when item object created or when updated or deleted.
beforeinsert event in item class called , update balance not case when when try delete item beforedelete not called
i trying delete item way
purchaseorderinstance.removefromitems iteminstance
this way no error message , balance property not calculated
if try
iteminstance.delete(flush:true)
i error message
error initializing application: deleted object re-saved cascade (remove deleted object associations): [ni.sb.item#2]; nested exception org.hibernate.objectdeletedexception: deleted object re-saved cascade (remove deleted object associations): [ni.sb.item#2]
i hope can me
it not work this. delete()
item purchase must do
purchase.removefromitems (item) item.delete ()
problem removefromitems()
clear belongsto
reference , deletebefore()
event fail.
another problem approach is, long purchase not saved , doing balance
, balance
wrong.
the easiest way make work recalculate balance on each access:
class purchase { bigdecimal balance bigdecimal getbalance () { bigdecimal total = 0 items.each { item item -> total += item.total () } total } list items static hasmany = [items:item] } class item { string product integer quantity bigdecimal price bigdecimal total () { price * quantity } // rest of code ... }
i recommend read gorm gotchas.
Comments
Post a Comment