I am developing an application which queries data from an XML file and creates multiple objects with that data.
class Search {String artist}
class Performance {static belongsTo = [events:Event, artists:Artist]}
class Location {static belongsTo = [events:Event]}
class Event {static hasMany = [performances:Performance]}
class Artist {static hasMany = [performances:Performance]}
This are the domain classes (for the sake of simplicity only relationships are shown).
Then I want to create instances of this objects when the user inserts a new artist in the SearchController. I tried to do that with the following code for the save closure in the SearchController but it seems that it’s not working. The resultList is a Map with the values queried from the XML file.
def save = {
def searchInstance = new Search(params)
def resultsList = searchService.lastFmVenues(params.artist)
resultsList.each{
def performanceInstance = new Performance()
def locationInstance = new Location(venue:it.venue, street:it.street, city:it.city, postcode:it.postalcode, country:it.country, lat:it.lat, lng:it.lng)
def artistInstance = new Artist(name:params.artist).addToPerformances(performanceInstance)
def eventInstance = new Event(eventId:it.eventID, title:it.eventTitle, date:it.date, location:locationInstance)
if (searchInstance.save(flush:true) && eventInstance.save(flush: true) && artistInstance.save(flush: true) && locationInstance.save(flush: true) && performanceInstance.save(flush:true)) {
flash.message = "${message(code: 'default.created.message', args: [message(code: 'search.label', default: 'Search'), searchInstance.id])}"
}
else {
render(view: "create", model: [searchInstance: searchInstance])
}
}
redirect(action: "show", id: searchInstance.id)
}
Any ideas?
Thank you.
Try saving your objects with
save(failOnError: true). This will cause grails to throw an exception if the objects don’t validate. The default behavior is to simply return false from the save method.You can make failOnError the default behavior by setting
grails.gorm.failOnError=truein yourConfig.groovy, but I wouldn’t recommend it for anything besides troubleshooting.