1
votes

I have a Grails application using Grails 2.3.8 and Mongo GORM plugin 3.0.1 . I have a service which constructs an object during its first invocations and saves it in mongoDB and returns it. In subsequent invocations, it would just retrieve the constructed object from the mongoDB and return it.

    def loadWeekData(String startDate,String storeId){
    def weekJson = WeekJson.findByStoreIdAndStartDate(storeId,startDate)

    if(weekJson==null){
        //construct weekJson here
        weekJson.save(flush:true)
        weekJson=WeekJson.findByStoreIdAndStartDate(storeId,startDate)
    }


    weekJson
  }

WeekJson domain class has other nested objects with hasMany relation. WeekJson hasMany Employee which hasMany Day which hasMany Planned which hasMany Activity

WeekJson domain class

    public class WeekJson{
    static hasMany = [employees:Employee]
    static mapWith = "mongo"
    static mapping = {
    employees fetch: 'join'

    }
    String toString()
    {
    "$employees"
    }

  }

Employees domain class

    public class Employee {

static mapWith = "mongo"
static hasMany = [days:Day]

static mapping = {
    days fetch: 'join'
    }
    String toString()
    {
    "$days"
    }
    }

Day domain class

    public class Day {

 Planned planned;
 static mapWith = "mongo"
 static constraints = {
 planned nullable:true
 }

 String toString()
 {
     " plan: $planned "
 }

 static mapping = { planned lazy:false}
    }

Planned domain class

     public class Planned {

List<Activity> activities
static hasMany = [activities:Activity]
static mapWith = "mongo"

static mapping = {
    activities lazy:false
   }

String toString()
{ activities }
}

Activity Domain class

    public class Activity {
    String inTime;
String outTime;
double duration;
String type;
String desc;
static mapWith = "mongo"
static constraints = {
    duration nullable:true
    type nullable:true
    desc nullable:true
}

String toString()
{
    "$inTime to $outTime"  
}
}

I have changed fetching behavior to eager in all the classes with hasMany relations.

The first time, all the nested objects are constrcuted properly, saved in mongoDB, and the returned object is correct.

However, for the next call, Activity objects are null. I've verified that the nested objects are still present in mongoDB during this call. Records in the Planned collection have ids to Activity collection records .

When I do,

   println weekJson.employees.days.planned.activities

the list of `Activity is printed. However,

    println weekJson

gives Activity list null and so does rendering as Json.

Why is GORM not retrieving the nested objects the second time around ? Is it possible that this a problem of GORM being unable to handle relationships with this level of nesting ?

1

1 Answers

0
votes

Maybe you should switch to sub-documents in your domain model.

Btw, if you want to help us help you, post more data on your case: which version of mongo, grails etc. you are using? what your domain classes look like? what do you see in the mongo collections upon saving?