объект spring-data-mongodb, реализующий интерфейс, создает неправильные коллекции

#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 помощью .

Это работает так, как это работает, позволяя людям хранить объекты иерархии типов в одной коллекции, чтобы разрешить полиморфные запросы. Если вам это не нужно, то можно использовать интерфейс репозитория для конкретного типа домена.