Как настроить имя коллекции MongoDb для класса в Spring данных
У меня есть коллекция под названием Products
в моей базе данных MongoDB, которая представлена интерфейсом IProductPrice
в моем Java-коде. Следующее объявление репозитория вызывает Spring Date для просмотра коллекции db.collection: Intelliprice.iProductPrice
.
Я хочу, чтобы он настраивал его для поиска в db.collection: Intelliprice.Products
с использованием внешней конфигурации вместо того, чтобы помещать аннотацию @Collection(..)
на IProductPrice
. Это возможно? Как я могу это сделать?
public interface ProductsRepository extends
MongoRepository<IProductPrice, String> {
}
Ответы
Ответ 1
Единственный способ добиться этого - аннотировать класс домена с помощью @Document
с использованием свойства collection
для определения имени экземпляров коллекции этого класса, который должен сохраняться.
Однако существует проблема JIRA, которая предполагает добавление стратегии сменных имен для настройки способов сортировки имен классов, коллекций и свойств в более глобальный путь. Не стесняйтесь комментировать ваш вариант использования и проголосуйте за него.
Ответ 2
используя ответ от Оливера Гирке выше,
работая над проектом, где мне нужно создать несколько коллекций для одного объекта, я хотел использовать репозитории spring и должен был указать объект, который будет использоваться перед использованием репозитория.
Мне удалось изменить имя коллекции репозитория по требованию с помощью этой системы, используя SPeL. Вы можете работать только с одной коллекцией за один раз.
Объект домена
@Document(collection = "#{personRepository.getCollectionName()}")
public class Person{}
По умолчанию spring Репозиторий:
public interface PersonRepository
extends MongoRepository<Person, String>, PersonRepositoryCustom{
}
Пользовательский интерфейс репозитория:
public interface PersonRepositoryCustom {
String getCollectionName();
void setCollectionName(String collectionName);
}
реализация:
public class PersonRepositoryImpl implements PersonRepositoryCustom {
private static String collectionName = "Person";
@Override
public String getCollectionName() {
return collectionName;
}
@Override
public void setCollectionName(String collectionName) {
this.collectionName = collectionName;
}
}
Чтобы использовать его:
@Autowired
PersonRepository personRepository;
public void testRetrievePeopleFrom2SeparateCollectionsWithSpringRepo(){
List<Person> people = new ArrayList<>();
personRepository.setCollectionName("collectionA");
people.addAll(personRepository.findAll());
personDocumentRepository.setCollectionName("collectionB");
people.addAll(personRepository.findAll());
Assert.assertEquals(4, people.size());
}
В противном случае, если вам нужно использовать переменные конфигурации, вы можете использовать что-то вроде этого? источник
@Value("#{systemProperties['pop3.port'] ?: 25}")