Spring Data MongoDb для наследования классов - PullRequest
9 голосов
/ 09 января 2012

Я хочу хранить разные данные в одной коллекции в MongoDb и иметь компоненты данных Spring с соответствующим полем.

Извините, я пропустил детали.

родительский компонент:

class A
    int a

Чайлдс:

class B extends A
    double b

class C extends A
    String c

Итак, в монго есть следующий документ

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

Когда я получаю данные, это нормально. Но когда я вызываю сохранить метод из CrudRepository для B, он перезаписывает все данные, и я теряю C.

Мне известен только один хороший вариант создания пользовательского метода сохранения с добавочными обновлениями, например

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

но с отражением.

У вас есть другие идеи?

Заранее спасибо.

1 Ответ

6 голосов
/ 18 февраля 2012

Для Spring-data MongoTemplate, в дополнение к полям в вашем объекте, также сохраняется дополнительное имя поля _class, которое сообщает шаблону, какой класс он сохраняет.
Вы не сможете правильно сохранить объект, используяхранилище другого объекта, независимо от отношения наследования.

CrudRepository for Spring по сути является шаблоном Generic Dao.Поскольку все ваши dao реализуют интерфейс и имеют метод save, вы сможете сохранить любой объект, зная, какой dao использовать.

Для этого вы можете создать RepositoryFactory, который используется дляначальный ваш репозиторий, который предлагает функцию getRepository (тип класса), которая предоставляет вам соответствующий репозиторий для вашего класса.Тогда вы сможете сделать что-то вроде:

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

Более подробную информацию вы можете найти здесь: http://www.rainydayinn.com/dev/dao-factory-and-generic-dao-wiring-in-spring/

Если вы хотите сохранить все свои объекты в одной коллекции, вы можетеиспользуйте аннотацию @Document (collection = "mycollection").Если вы не даете имя коллекции, по умолчанию каждый класс сохраняется в отдельной коллекции в соответствии с именем класса.

...