#java #spring #entity-framework #mongodb #spring-data-mongodb
#java #spring #сущность-фреймворк #mongodb #spring-data-mongodb
Вопрос:
Я хочу разрешить пользователю выбирать свои собственные технологии сохранения, и для этого разработчики должны писать объекты, которые реализуют данный интерфейс.
По умолчанию приложение использует spring-data с mongodb, ниже приведен код извлечения из объекта:
@Document(collection="event_handlers")
@CompoundIndexes({
@CompoundIndex(name = "handlers_unique_idx", def = "{'eventName': 1, 'className': 1}", unique=true, sparse=true)
})
public class HandlerImpl implements Handler {
....
}
и связанный с ним репозиторий:
@Repository
public interface HandlerRepository extends MongoRepository<Handler, String> {
...
}
Выполняя интеграционный тест, я заметил, что приложение записывает объект в неожиданную коллекцию с именем handler в качестве интерфейса объекта, а не в ожидаемую коллекцию с именем event_handlers, и, кроме того, составной ключ не работает, потому что он был связан с правильной коллекцией, которая все время остается пустой.
Это список коллекций для моей БД:
> show collections
event_handlers
handler
system.indexes
>
Как я могу использовать spring-data для использования такой конфигурации?
Спасибо
Ответ №1:
Объекты коллекции, в которых они хранятся, определяются типом домена, с которым вы настраиваете репозиторий. Таким образом, вы должны увидеть, что это работает должным образом, если вы аннотируете Handler
с @Document
помощью .
Это работает так, как это работает, позволяя людям хранить объекты иерархии типов в одной коллекции, чтобы разрешить полиморфные запросы. Если вам это не нужно, то можно использовать интерфейс репозитория для конкретного типа домена.