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
Ben tam olarak aynı durumdayım. Sana yardımcı olan bir şey buldun mu? Teşekkürler ! – Moltes
Bunu nasıl uygulayacağınızı anladınız mı? Ben de aynı durumdayım. – Sannu