2013-01-10 55 views
8

कुछ वर्ग Bar में सभी वसंत डेटा खजाने की सूची को देखते हुए?दिए गए डोमेन क्लास के लिए वसंत डेटा भंडार उदाहरण कैसे प्राप्त करें?</p> <pre><code>@Autowired private List<Repository> repositories; </code></pre> <p>मैं उपरोक्त सूची में एक मौजूदा डोमेन वर्ग <code>Foo</code> के लिए भंडार कैसे पा सकते हैं:

यह मानते हुए कि निम्नलिखित मौजूद है:

@Entity 
public class Foo { 
    ... 
} 

और

public interface FooRepository extends JpaRepository<Foo, String> {} 

उत्तर

2

समाधान करने के लिए महत्वपूर्ण है वसंत के org.springframework.data.repository.core.support.DefaultRepositoryMetadata जो विधि getDomainType() प्रदान करता है।

DefaultRepositoryMetadata को रिपोजिटरी इंटरफेस को कन्स्ट्रक्टर तर्क के रूप में चाहिए। तो कोई भी सभी मौजूदा भंडारों पर लूप कर सकता है, रिपोजिटरी इंटरफ़ेस पुनर्प्राप्त कर सकता है (जो अभी भी एक मुश्किल हिस्सा है क्योंकि रिपोजिटरी इंस्टेंस में एक से अधिक इंटरफ़ेस हैं) और getDomainType()Foo.class के बराबर है।

18

स्प्रिंग डाटा कॉमन्स एक वर्ग Repositories कि (….getRepository(Class<?> type) के माध्यम से) डोमेन वर्ग द्वारा इन उदाहरणों प्राप्त करने के लिए सभी भंडार सेम उस में परिभाषित खोजने के लिए एक ListableBeanFactory लेता है और एक API को उजागर करता है शामिल हैं।

इस कक्षा का उपयोग देखभाल के साथ किया जाना चाहिए। चूंकि रिपोजिटरी उदाहरणों के लिए कुछ गंभीर प्रॉक्सी पीढ़ी चल रही है, इसलिए आपको यह सुनिश्चित करना होगा कि Repositories उदाहरण ApplicationContext निर्माण के दौरान जितनी देर हो सके बनाया गया हो। पसंदीदा तरीका ApplicationListener को लागू करना है और ContextRefreshedEvent को सुनकर उदाहरण बनाएं।

मामले में आप एक वेब अनुप्रयोग लिख रहे हैं, सबसे सुरक्षित तरीका Repositories उपयोग करने के लिए ApplicationContextContextLoaderListener द्वारा बनाई में खजाने bootstrapping और Repositories जगह (विवरण के लिए वसंत MVC के reference documentation देख कर रहा है।

+6

क्या आपके पास वेब एप्लिकेशन के लिए कोड नमूना है? –

7
@Service 
public class GenericRepository { 

    @Autowired 
    private WebApplicationContext appContext; 

    Repositories repositories = null; 

    public GenericRepository() { 
     repositories = new Repositories(appContext); 
    } 

    public JpaRepository getRepository(AbstractPersistable entity) { 
     return (JpaRepository) repositories.getRepositoryFor(entity.getClass()); 
    } 

    public Object save(AbstractPersistable entity) { 
     return getRepository(entity).save(entity); 
    } 

    public Object findAll(AbstractPersistable entity) { 
     return getRepository(entity).findAll(); 
    } 

    public void delete(AbstractPersistable entity) { 
     getRepository(entity).delete(entity); 
    } 
}