Когато Morphia чете вашите документи от резултатите от заявката, първото нещо, което прави, е да създаде нов екземпляр на вашия обект, Student
. Той просто извиква конструктора без аргумент. Няма намесена магия. Полето град се инициализира със стойност. След като това стане, Morphia ще вземе всеки ключ в документа, върнат от базата данни, ще намери това картографирано поле и ще го зададе. Във вашия случай в документа няма градски ключ и това поле никога не се задава от Morphia, оставяйки инициализираната стойност на място.
Като цяло инициализирането на полета на обекти като това е лоша практика. За всеки обект, зареден от базата данни, JVM трябва да инициализира тези полета до някаква стойност само за да ги презапише по-късно. В случаи като вашия, когато определени полета не се връщат в резултат от заявка, тези стойности остават, след като Morphia върне новите екземпляри обратно във вашето приложение.