2015-11-04 6 views
8

यहाँ नमूना जेनेरिक भंडार कार्यान्वयन जो वसंत PagingAndSortingRepository फैली हुई है के लिए वसंत सेवाओं में autowired जा सकता है,स्प्रिंग बूट में जेनेरिक जेपीए भंडार लागू करने के लिए कैसे - कौन किसी भी संस्था/वर्ग प्रकार

@NoRepositoryBean 
public interface GenericRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> { 

    public List<T> findByNamedQuery(String name); 
    public List<T> findByNamedQueryAndParams(String name, Map<String, Object> params); 
    public T findOneByNamedQuery(String name); 
    public T findOneByNamedQueryAndParams(String name, Map<String, Object> params); 

}

फैक्टरी बीन वर्ग,

public class GenericRepositoryFactoryBean<R extends JpaRepository<T, I>, T, I extends Serializable> extends 
    JpaRepositoryFactoryBean<R, T, I> { 

    @SuppressWarnings("rawtypes") 
    protected RepositoryFactorySupport createRepositoryFactory(EntityManager em) 
    { 
    return new MyRepositoryFactory(em); 
    } 

    private static class MyRepositoryFactory<T, I extends Serializable> extends JpaRepositoryFactory { 

    private final EntityManager em; 

    public MyRepositoryFactory(EntityManager em) 
    { 
     super(em); 
     this.em = em; 
    } 

    @SuppressWarnings("unchecked") 
    protected Object getTargetRepository(RepositoryMetadata metadata) 
    { 
     return new GenericRepositoryImpl<T, I>((Class<T>) metadata.getDomainType(), em); 
    } 

    protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) 
    { 
     return GenericRepositoryImpl.class; 
    } 
    } 
} 

कार्यान्वयन वर्ग,

public final class GenericRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements 
    GenericRepository<T, ID> { 

    private final EntityManager em; 
    private final Class<T> domainClass; 

    public GenericRepositoryImpl(Class<T> domainClass, EntityManager entityManager) 
    { 
     super(domainClass, entityManager); 
     this.em = entityManager; 
     this.domainClass = domainClass; 
    } 

    @Override 
    public List<T> findByNamedQuery(final String name) 
    { 
     validate(name); 
     return this.em.createNamedQuery(name, domainClass).getResultList(); 
    } 

    @Override 
    public T findOneByNamedQuery(String name) 
    { 
     validate(name); 
     return this.em.createNamedQuery(name, domainClass).getSingleResult(); 
    } 

    @Override 
    public List<T> findByNamedQueryAndParams(String name, Map<String, Object> params) 
    { 
     validate(name, params); 
     final TypedQuery<T> query = this.em.createQuery(name, domainClass); 
     setParams(query, params); 
     return query.getResultList(); 
    } 

} 

तो जब मैं ग्राहक.जावा, संदेश.जावा इत्यादि जैसे विभिन्न प्रकार के सेवाओं में ऑटोवायर जेनेरिक रिपोजिटरी को आज़माएं, तो इसे फेंकने के लिए कम से कम एक बीन प्रकार इंटरफेस जेनेरिक रिपोजिटरी की आवश्यकता होती है। यह तब काम करता है जब मैं ग्राहक और संदेश प्रकार दोनों के लिए व्यक्तिगत भंडार बना देता हूं। एकाधिक भंडार बनाने के बिना, मैं इसे लागू करने में सक्षम नहीं हूं।

@Service 
@Transactional(noRollbackFor = Exception.class) 
public class CustomerService { 

@Autowired 
private GenericRepository<Customer, Serializable> cr; works fine with just one entity type 

@Autowired 
private GenericRepository<Message, Serializable> cr; throws exception 

यदि 100 या अधिक इकाई वर्ग हैं, तो मैं 100 भंडारों का निर्माण कर रहा हूं और जो बुरा है। अगर ऐसा करने का बेहतर तरीका है तो कृपया मुझे बताएं।

+0

मैं ठीक उसी स्थिति में हूं। क्या आपको कुछ मदद मिली? धन्यवाद ! – Moltes

+0

क्या आप लोग यह समझते हैं कि इसे कैसे कार्यान्वित किया जाए? मैं भी इसी स्थिति में हूं। – Sannu

उत्तर

3

मैं क्या यह नए इंटरफ़ेस तरीकों क्या @query एनोटेशन द्वारा ऐसा करने के लिए और BeanFactory या impl के साथ खुद को परेशान नहीं करते हैं बताने के लिए आसान हो जाएगा पढ़ा है के लिए ...

@Repository 
public interface GenericRepository<T, ID extends Serializable> extends JpaRepository<T, ID> { 
@Query(value = "SELECT c FROM customers c WHERE c.name = :name") 
public List<T> findByNamedQuery(String name); 
... 
} 

Using generics in Spring Data JPA repositories

यदि यह आपके लिए लागू नहीं है और आप कह रहे हैं कि आपका कोड एक भंडार के साथ काम करता है लेकिन जब आप दूसरा जोड़ते हैं तो असफल हो जाता है, बीन के दायरे को प्रोटोटाइप पर सेट करने और सेट करने के लिए है, लेकिन यह सिर्फ एक अटकलें है। मुझे खेद है कि अगर मैं वास्तव में मदद नहीं करता, तो मुझे बहुत नफरत नहीं है ^^

संबंधित मुद्दे