2015-11-04 6 views
8

Ecco l'implementazione Repository generico campione che estende la PagingAndSortingRepository primavera,Come implementare Generico JPA Repository nella primavera del Boot - che può essere autowired in servizi di primavera per qualsiasi tipo di entità/classe

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

}

classe Bean Factory,

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

classe di implementazione,

Così quando provo ad Autowire GenericRepository in servizi per diversi tipi come Customer.java, Message.java ecc. Il lancio richiede almeno un tipo di bean di interfaccia GenericRepository. Funziona se creo repository individuali per il tipo di cliente e di messaggio. Senza creare più repository, non sono in grado di implementarlo.

@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 

Se hanno 100 o più classi di entità, quindi ho finito per creare 100 di repository e che è male. Per favore fatemi sapere se c'è un modo migliore per farlo.

+0

Sono nella stessa identica situazione. Hai trovato qualcosa di utile? Grazie ! – Moltes

+0

Avete capito come implementarlo? Sono nella stessa situazione pure. – Sannu

risposta

3

Per quello che ho letto che sarà più facile per raccontare i nuovi metodi di interfaccia Cosa fare Di @query annotazione e non si preoccupano di te stesso con BeanFactory o 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

Se questo non è applicabile per te e stai dicendo che il tuo codice funziona con un repository ma fallisce quando aggiungi un secondo, il mio primo pensiero è provare e impostare l'ambito del bean su prototipo ma questa è solo una speculazione. Mi dispiace se non ho davvero aiutato, non odiarmi troppo ^^

Problemi correlati