Простой Groovy \ Grails код:
def start = {
source.save()
def result = getJson(hotelSite, eng + index, [:])
parse(JSONObject.fromObject( result.json.text() ))
render "OK"
}
def parse = {JSONObject json ->
def cities = json.get("filter").cities
println cities
def kievHotels = getJson(hotelSite, eng + root + '/searchhotelsbycity', ['city' : 'kiev'])
kievHotels = JSONObject.fromObject(kievHotels.json.text())
println kievHotels
kievHotels.rows.each { ht->
HotelText hotelText = new HotelText(lang : 'en', name : ht.l_name, description : ht.description, address : ht.address)
hotelText.save(/*flush:true*/)
println "hotel text saved"
Hotel hotel = new Hotel(lat : ht.lat, lon : ht.lon, source : source, sourceid : ht.id)
hotel.addToHotelTexts(hotelText)
//hotel.save(/*flush:true*/)
println "hotel saved"
ht.options.each {op->
new HotelFeatures(lang:'en', name : op, source : source, hotel : hotel).save()
}
println "options saved"
ht.photos.each {ph->
new HotelPhotos(hotel : hotel, photourl : ph, type : 'hotel').save()
}
println "photo saved"
hotel.save()
}
println "THE END"
return "THE END"
}
def getJson = {uri, path, query ->
Thread.sleep(10)
return withHttp(uri: uri) {
return get(path : path, query : query) { resp, json ->
return ['response' : resp, 'json' : json ]
}
}
}
Все должно быть идеально, но Grails выдает исключение после завершения выполнения метода «start» \ замыкания (программа выводит «THE END», выводит сообщение «OK», а затем выдает исключение):
org.springframework.dao.InvalidDataAccessApiUsageException : объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед сбросом: com.stanfy.sweethome.domains.Hotel ; вложенное исключение
org.hibernate.TransientObjectException : объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед сбросом: com.stanfy.sweethome.domains.Hotel
at java.lang.Thread.run (Thread.java:619)
Вызывается: org.hibernate.TransientObjectException : объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед сбросом: com.stanfy.sweethome.domains.Hotel
... еще 1