Configuré un almacén de datos simple para almacenar una versión y una compilación. Aquí están sus clases-
@Entity("Version") public class Version { @Id private ObjectId id = new ObjectId(); public Version() {} private String name; } @Entity("Build") public class Build { public Build() {} @Id ObjectId id = new ObjectId(); @Reference Version version; String name; }(los campos en las clases que tienen sus getters, setters, constructores y toString implementados).
Ahora estoy tratando de simplemente almacenar la versión primero y luego intentar almacenar una compilación y luego leer todas las compilaciones que están presentes.
Version version = new Version("first"); Version version2 = new Version("second"); VersionDAO.saveVersion(version); VersionDAO.saveVersion(version2); VersionDAO.printAllVersions(); Build build = new Build(version, "Hello"); BuildDAO.saveBuild(build); BuildDAO.getAllBuilds(); VersionDAO.getAllVersions() funciona bien y me da la lista de versiones almacenadas, pero BuildDAO.getAllBuilds() arroja un error que dice:
Excepción en el subproceso "principal" dev.morphia.mapping.MappingException: no se pudo mapear try_morphia.Build con ID: 602f4e9ff760cd5638698273 en la base de datos 'Builds'
Provocado por: dev.morphia.mapping.MappingException: la referencia ({ "$ref" : "Version", "$id" : "602f4e7b96f28d54bd1cc883" }) no se pudo recuperar para intentar_morphia.Build.version
Parece que hay algún problema de enlace de referencia que no puedo entender. Tengo que usar @Reference ya que este fragmento de código es parte de un fragmento más grande y no puedo cambiarlo por completo.
MongoDB Compass muestra el valor de una entrada de compilación como-
_id: ObjectId("602f4e9ff760cd5638698273") className: "trying_morphia.Build" version: DBRef(Version, 602f4e7b96f28d54bd1cc883, undefined) name:"Hello"¿Qué me falta en la referencia?
Lo que he intentado: Cambiar la identificación de Version y Build a string.
Las referencias cruzadas de bases de datos no son compatibles con Morphia. Deberá administrar esas referencias manualmente.