Lorsque Morphia lit vos documents à partir des résultats de la requête, la première chose qu'il fait est de créer une nouvelle instance de votre entité, Student
. Il invoque simplement le constructeur sans argument. Il n'y a pas de magie impliquée. Le champ ville est initialisé avec une valeur. Une fois cela fait, Morphia prendra chaque clé du document renvoyé par la base de données, trouvera ce champ mappé et le définira. Dans votre cas, il n'y a pas de clé de ville dans le document et donc ce champ n'est jamais défini par Morphia en laissant la valeur initialisée en place.
En général, initialiser des champs sur des entités comme celle-ci est une mauvaise pratique. Pour chaque entité chargée à partir de la base de données, la JVM doit initialiser ces champs à une valeur uniquement pour les écraser ultérieurement. Dans des cas comme le vôtre où certains champs ne reviennent pas dans un résultat de requête, ces valeurs restent après que Morphia a renvoyé les nouvelles instances à votre application.