简单的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在“开始”方法\关闭执行结束后会引发异常(程序打印“THE END”,呈现“OK”消息,然后引发异常):

org.springframework.dao.InvalidDataAccessApiUsageException :对象引用了一个未保存的临时实例-在刷新之前保存该临时实例:com.stanfy.sweethome.domains.Hotel;嵌套异常为

org.hibernate.TransientObjectException :对象引用了一个未保存的临时实例-在刷新之前保存该临时实例:com.stanfy.sweethome.domains.Hotel
在java.lang.Thread.run(Thread.java:619)

引起原因: org.hibernate.TransientObjectException :对象引用了一个未保存的临时实例-在刷新之前保存该临时实例:com.stanfy.sweethome.domains.Hotel
...还有1个

请您参考如下方法:

在您的集合映射中,您必须指定cascade=CascadeType.ALL(我不知道它在Groovy中的精确程度)。

该异常表示您有一个其元素未保留的集合。只有设置了以上选项,Hibernate才会自动保留它们。

附言您可能已经搜索了关于该异常的数百个线程(以及关于SO的线程)。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!