2014-04-14 26 views
0

我有以下問題:Grails/Groovy不會持久更改對象的集合

我的對象路由包含路由點列表。當我改變這個列表時,更改的列表被保存。但是,當下一個方法訪問列表時,它看起來像是改變了。我規定某種事務回滾,b/c在修改方法結束時,我通過從數據庫中加載它來訪問列表,並且它仍然具有正確(更改)的大小。下面的代碼:

首先改變方法:

def removeStationFromRoute(station){ 
    def driver = Driver.get(Integer.valueOf(requestAccessService.getParams().userId)) 
    def route = driver.routes.find{ 
     it.routeDate == new Date().clearTime() 
    } 
    def rp = Routepoint.findByStation(station) 

    route.routepoints.remove(rp) 

    def newRoute = driver.routes.find{ it.routeDate == new Date().clearTime()} 
    println 'new route size: ' + newRoute.routepoints.size() 

    def newRoute2 = Route.get(route.id) 
    println 'new route from db size: ' + newRoute2.routepoints.size() 

} 

同時打印返回一個大小爲5,這是正確的。該方法進行之後,執行該方法:

def getDriverRoute(){ 
    def driver = User.get(Long.valueOf(params.userId)) 
    def route = driver.routes.find{ it.routeDate == new Date().clearTime()} 
    println 'serialized route size: ' + route.routepoints.size() 
    def routeString = jobService.serializeRoute(route) 
    log.info('Route with ' + route.routepoints.size() + " stations serialized for User " + driver.encodeAsHTML()) 
    render routeString 
} 

它打印爲6個,彷彿沒有變化發生在列表中。我已經嘗試在「removeStationFromRoute」列表中進行更改後保存驅動程序,路由和路由點,並檢查三個對象是否有錯誤。沒有幫助。

感謝您的任何想法做什麼!

+0

的是,在第二個方法一個錯字朝向駕駛者User.get代替Driver.get? –

+0

Nope,Driver是User的一個子類,但是我在兩種方法中都將其更改爲Driver.get(),但它仍然不起作用 – olkoza

回答

1

我想你有一個RouteRoutepoints之間的1-N關係?像

class Route { 
    static hasMany = [routepoints: Routepoint] 
} 

class Routepoint { 
    static belongsTo = [route: Route] 
} 

東西應該不是添加/使用Collection接口的add/remove方法去除routpoints。相反,您應該使用GORM方法,例如,

route.addToRoutepoints(routepoint) 
route.removeFromRoutepoints(routepoint) 
+0

更改了它,但得到了相同的結果 – olkoza

0

首先, 後您已經使用route.removeFromRoutepoints(routepoint) 在第一方法與路線除去路線點的映射,路由對象仍然需要使用.save/.merge方法來保留。(檢查here

其次。 在Hibernate中,如果對象已經在Hibernate會話中緩存,那麼使用Domain.get(id)並不總是會觸及數據庫。檢查here

希望它可以幫助...