2012-01-09 43 views
9

Quiero almacenar diferentes datos a una colección en MongoDB y tienen beans de datos de primavera con campo apropiado ..primavera de datos MongoDB para la herencia de clases

Lo siento, he detalles omitidos.

frijol Padres:

class A 
    int a 

Childs:

class B extends A 
    double b 

class C extends A 
    String c 

Por lo tanto, no hay siguiente documento en mongo

{a : 1, b : 2.3, c : "Test"} 

Cuando voy a buscar los datos, que está bien. Pero, cuando llamo Guardar método de CrudRepository para B, reescribe todos los datos y pierdo C.

sé sólo una buena opción para crear la costumbre guardar método con actualizaciones incrementales, como

update.set("b", newvalue)... 

pero con reflejo.

¿Tiene alguna otra idea?

Gracias de antemano.

+1

¿Te importaría ser un poco más detallado sobre la interacción con 'MongoTemplate' y tu repositorio? ¿Estás leyendo los datos en un objeto de 'B'? Eso debería en realidad devolver un objeto de tipo 'C' ya que deberíamos detectar la información del tipo almacenado. Más allá de eso, la información del mapeo de la colección sería útil. Asegúrese de que todas las clases estén asignadas a la misma colección. –

+0

Hola Oliver, gracias por tu respuesta. Sí, he reemplazado el método 'guardar' de 'MongoTemplate' para usar la consulta de actualización. Ahora cuando guardo 'B', solo actualiza los campos 'B'. Pero trato de encontrar una solución más asombrosa ... –

+0

Si agrega los fragmentos de código relevantes, podemos profundizar un poco más en el tema :) –

Respuesta

5

Para datos de primavera MongoTemplate, además de los campos de su objeto, también se guarda un nombre de campo adicional que indica a la plantilla qué clase está guardando.
No podrá guardar un objeto correctamente utilizando el repositorio de otro objeto, independientemente de de la relación de herencia.

El CrudRepository for Spring es esencialmente el patrón Dao genérico. Dado que todos sus datos implementan la interfaz y tienen el método guardar, podrá guardar cualquiera de los objetos al saber qué datos desea utilizar.

Para hacer esto, puede crear una RepositoryFactory que se usa para inicializar su repositorio, que ofrece una función getRepository (tipo de clase) que le proporciona el repositorio apropiado para su clase. Entonces usted será capaz de hacer algo como:

repositoryFactory.getRepository(myType.getClass()).save(myType); 

Puede encontrar más detalles aquí: http://www.rainydayinn.com/dev/dao-factory-and-generic-dao-wiring-in-spring/

Si desea guardar todos los objetos de la misma colección, se puede utilizar la anotación @Document (collection = "mycollection"). Si no le da un nombre de colección, el valor predeterminado es guardar cada clase en una colección separada de acuerdo con el nombre de la clase.

Cuestiones relacionadas