2012-09-05 9 views
11

Mam kolekcję o nazwie Products w mojej bazie danych MongoDB, która jest reprezentowana przez interfejs IProductPrice w moim kodzie Java. Poniższa deklaracja repozytorium powoduje, że Data Wiosny będzie wyglądać dla kolekcji db.collection: Intelliprice.iProductPrice.Jak skonfigurować nazwę kolekcji MongoDb dla klasy w danych źródłowych

Chcę skonfigurować go tak, aby wyglądał w db.collection: Intelliprice.Products przy użyciu konfiguracji zewnętrznej, zamiast umieszczać adnotację @Collection(..) na IProductPrice. czy to możliwe? Jak mogę to zrobić?

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

Odpowiedz

10

Jedynym sposobem można obecnie osiągnąć to poprzez opisywanie swoją klasę domeny z @Document pomocą właściwości collection zdefiniować nazwę instancji zbiórki tej klasy powinny być utrwalone na.

Otwarty jest kod JIRA issue, który sugeruje dodanie wtykanej strategii nazewnictwa w celu skonfigurowania metod obsługi klas, kolekcji i właściwości w bardziej globalny sposób. Możesz skomentować swój przypadek użycia i zagłosować.

+1

Dziękuję, jestem świadomy adnotacji @Document i prawdopodobnie na tym skorzystam. Zasadniczo chciałem uzupe łnić konfigurację z rzeczywistej klasy. Problem JIRA, z którym się łączysz, mówi o strategii nazewnictwa i nadal sugeruje użycie adnotacji do niestandardowych nazw. – Danish

+1

Atrybut 'collection' obsługuje Spel, dzięki czemu można wywoływać dowolne metody na innych komponentach Spring, aby obliczyć nazwę kolekcji, np. Za pomocą' # {# bean.someMethod (T (your.fully.qualified.Type))} 'if you zarejestrowali komponent jako "bean" dostarczający metodę 'someMethod (klasa )'. –

6

używając odpowiedzi od Olivera Gierke'a powyżej, pracując nad projektem, w którym potrzebuję utworzyć wiele kolekcji dla jednego podmiotu, chciałem skorzystać z repozytoriów sprężyn i trzeba określić encję do użycia przed użyciem repozytorium.

Udało mi się zmodyfikować nazwę kolekcji repozytorium na żądanie przy użyciu tego systemu, używając SPeL. Możesz pracować tylko w jednej kolekcji na raz.

obiekt Domain Wiosna

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

Domyślnie Repozytorium:

public interface PersonRepository 
    extends MongoRepository<Person, String>, PersonRepositoryCustom{ 
} 

klienta Repozytorium Interfejs:

public interface PersonRepositoryCustom { 
    String getCollectionName(); 

    void setCollectionName(String collectionName); 
} 

realizacja:

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; 
    } 
} 

Aby go użyć:

@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()); 
} 

W przeciwnym razie, jeśli chcesz używać zmiennych konfiguracyjnych, mógłbyś może użyć czegoś takiego? source

@Value("#{systemProperties['pop3.port'] ?: 25}") 
+0

Nie przetestowałem tego i jest niezbyt czyste, ale +1 tylko za kreatywność :) – alex

+0

Wygląda na to, że przechowujesz informacje "kontekstowe" w repozytorium, które potencjalnie jest automatycznie podłączone w różnych miejscach. Zgaduję, że to rozwiązanie nie jest bezpieczne dla wątków. – thanosa75

+0

@ thanosa75 masz rację, po prostu ponownie wykorzystałem to rozwiązanie i myślę, że posiadanie repozytorium, w którym zawsze podajesz nazwę kolekcji, byłoby o wiele bezpieczniejsze: zamiast repo.findAll()> repo.findAll ("nazwa kolekcji"). ale nie wiem, jak to zrobić elegancko (zamiast odtworzyć klasę, która ponownie używa szablonu mongo i zawsze ustawia nazwę kolekcji przed uruchomieniem żądania) – Jeremie

Powiązane problemy