hibernate - Grails controller saves the domain item anyways -
using grails 2.3.9
in controller checks , when failing returning custom error response. here code snippet:
def update() { def instance = group.get(params.groupid) instance.properies = params if (instance.haserrors()) { // going through here: instance not saved respond instance.errors, view:'edit' return } // custom checks if(checksfailed) { // instance saved anyways :( instance.discard() response.senderror(response.sc_conflict) return } instance.save flush:true // ... respond success }
when check fails, error response returned want it. however, instance gets saved anyways (the instance.save
not reached). how can make grails/hibernate know not save instance?
another approach might disconnect instance hibernate session. how have in grails?
update: in controller domain instance scaffolded, instance.discard()
trick works:
def update(group groupinstance) { if (groupinstance.haserrors()) { // going through here: instance not saved respond instance.errors, view:'edit' return } // custom checks if(checksfailed) { // instance not saved groupinstance.discard() response.senderror(response.sc_conflict) return } groupinstance.save flush:true // ... respond success }
i find difficult understand why works in 1 case , not in another.
the best way not use discard() instead use transactions , native transaction features of database. recommend moving logic service (separating controller flow code , logic of application. example:
class groupservice { @transactional void updatebook(params) { .... // custom checks if(checksfailed) { status.setrollbackonly() // rollback transaction } else { instance.save flush:true } } }
you can either call setrollbackonly
on transaction status or throw runtime exception.
note if use exceptions, can expensive best create custom exception type groupupdateexception
, override fillinstacktrace
not fill stack trace reduces cost of exception. see why throwable.fillinstacktrace() method public? why use it?
Comments
Post a Comment