2015-11-04 18 views
8

bahar PagingAndSortingRepository uzanır örnek Jenerik Depo uygulamasıdır için bahar hizmetlerine autowired edilebilirBahar Boot Jenerik JPA Deposu nasıl uygulanır - Herhangi bir varlık/sınıf türü Burada

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

}

Fabrika Bean sınıfı

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

Uygulama sınıfı,

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

} 

Bu nedenle, Autowire GenericRepository'yi Customer.java, Message.java vb. Gibi farklı türler için hizmetlere dönüştürmeye çalıştığımda, atmak için en az bir Bean türü arabirim GenericRepository gerekir. Bu, hem müşteri hem de ileti tipi için ayrı depolar oluşturduğumda çalışır. Birden fazla depo oluşturmadan bunu uygulayamıyorum. 100 veya daha fazla varlık sınıfları

@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 

, sonra ben depolarının 100'ün oluşturup sürekli kötü olan. Bunu yapmanın daha iyi bir yolu varsa lütfen bana bildirin.

Ben @query açıklama ile yapmak ve BeanFactory veya impl filan da ne yeni arayüz yöntemlerini anlatmak daha kolay olacak okuduklarıma için
+0

Ben tam olarak aynı durumdayım. Sana yardımcı olan bir şey buldun mu? Teşekkürler ! – Moltes

+0

Bunu nasıl uygulayacağınızı anladınız mı? Ben de aynı durumdayım. – Sannu

cevap

3

...

@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

Bu sizin için geçerli değilse ve kodunuzun tek bir depoyla çalıştığını, ancak ikinci kez eklediğinizde başarısız olduğunu söylüyorsanız, ilk düşüncem fasulyenin kapsamını prototipe göre denemek ve ayarlamaktır, ancak bu sadece bir spekülasyondur. Gerçekten yardım etmediysem özür dilerim, çok fazla nefret etmiyorum ^^

İlgili konular