यहाँ नमूना जेनेरिक भंडार कार्यान्वयन जो वसंत 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 भंडारों का निर्माण कर रहा हूं और जो बुरा है। अगर ऐसा करने का बेहतर तरीका है तो कृपया मुझे बताएं।
मैं ठीक उसी स्थिति में हूं। क्या आपको कुछ मदद मिली? धन्यवाद ! – Moltes
क्या आप लोग यह समझते हैं कि इसे कैसे कार्यान्वित किया जाए? मैं भी इसी स्थिति में हूं। – Sannu