복붙노트

[SPRING] Spring 데이터의 클래스에 대해 MongoDb 컬렉션 이름을 구성하는 방법

SPRING

Spring 데이터의 클래스에 대해 MongoDb 컬렉션 이름을 구성하는 방법

내 Java 코드에서 IProductPrice 인터페이스로 표시되는 MongoDB 데이터베이스에 Products라는 컬렉션이 있습니다. 다음 리포지토리 선언은 Spring Date가 콜렉션 db.collection : Intelliprice.iProductPrice를 보게합니다.

db.collection : Intelliprice.Products에서 IProductPrice에 @Collection (..) 주석을 추가하는 대신 외부 구성을 사용하도록 구성하려고합니다. 이것이 가능한가? 어떻게해야합니까?

public interface ProductsRepository extends
    MongoRepository<IProductPrice, String> {
}

해결법

  1. ==============================

    1.현재이 작업을 수행 할 수있는 유일한 방법은 도메인 클래스에 @Document를 사용하여이 클래스의 컬렉션 인스턴스 이름을 정의하는 collection 속성을 사용하여 주석을 저장하는 것입니다.

    현재이 작업을 수행 할 수있는 유일한 방법은 도메인 클래스에 @Document를 사용하여이 클래스의 컬렉션 인스턴스 이름을 정의하는 collection 속성을 사용하여 주석을 저장하는 것입니다.

    그러나 클래스, 콜렉션 및 프로퍼티 이름을보다 글로벌하게 처리하는 방법을 구성하는 플러그 가능한 이름 지정 전략을 추가하는 것이 좋습니다. 유스 케이스에 대해 의견을 말하고 투표를하십시오.

  2. ==============================

    2.위의 Oliver Gierke의 대답을 사용하여, 하나의 엔티티에 대해 여러 개의 콜렉션을 작성해야하는 프로젝트에서 작업 할 때 스프링 저장소를 사용하고 저장소를 사용하기 전에 사용할 엔티티를 지정해야했습니다.

    위의 Oliver Gierke의 대답을 사용하여, 하나의 엔티티에 대해 여러 개의 콜렉션을 작성해야하는 프로젝트에서 작업 할 때 스프링 저장소를 사용하고 저장소를 사용하기 전에 사용할 엔티티를 지정해야했습니다.

    SPeL을 사용하여이 시스템을 사용하여 필요에 따라 저장소 수집 이름을 수정할 수있었습니다. 한 번에 하나의 컬렉션에서만 작업 할 수 있습니다.

    도메인 객체

    @Document(collection = "#{personRepository.getCollectionName()}")
    public class Person{}
    

    기본 스프링 저장소 :

    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}") 
    
  3. from https://stackoverflow.com/questions/12274019/how-to-configure-mongodb-collection-name-for-a-class-in-spring-data by cc-by-sa and MIT license