Grails: org.hibernate.TransientObjectException - PullRequest
1 голос
/ 23 февраля 2010

Простой 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

Ответы [ 2 ]

3 голосов
/ 23 февраля 2010

В отображении вашей коллекции вы должны указать cascade=CascadeType.ALL (я не знаю, как именно это будет в Groovy).

Исключение означает, что у вас есть коллекция, элементы которой не сохранены. Hibernate сохраняет их автоматически, только если установлена ​​вышеуказанная опция.

P.S. Об этом исключении можно найти сотни потоков (в том числе и SO).

1 голос
/ 23 февраля 2010

У вас есть коллекции HotelPhotos и HotelFeatures на вашем Hotel объекте? Если это так, вам нужно будет добавить каждого из них, используя hotel.addToHotelPhotos(...) и hotel.addToHotelFeatures(...), как вы сделали с HotelTexts.

Тогда вам нужно будет только один раз вызвать функцию сохранения в отеле, и все остальные экземпляры будут сохранены (по умолчанию используется каскадный режим).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...