2015-11-04 4 views
8

Hier ist die Probe generische Repository Implementierung, die die Feder PagingAndSortingRepository erstreckt, Generisches JPA Repository in Spring-Boot implementieren - die in Feder Dienstleistungen für jede Einheit/Klassentyp

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

}

autowired werden kann

Fabrik Bean Klasse,

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

Implementierungsklasse,

Also, wenn ich versuche, GenericRepository in Dienste für verschiedene Typen wie Customer.java, Message.java usw. zu erzwingen, es erfordert mindestens eine Bean Typ der Schnittstelle GenericRepository. Dies funktioniert, wenn ich individuelle Repositories sowohl für den Kunden als auch für den Nachrichtentyp erstelle. Ohne das Erstellen mehrerer Repositories kann ich dies nicht implementieren.

Wenn 100 oder mehr Entity-Klassen haben, dann erstelle ich 100 von Repositories und was schlecht ist. Bitte lassen Sie mich wissen, ob es einen besseren Weg gibt, dies zu tun.

+0

Ich bin in genau der gleichen Situation. Hast du etwas gefunden, das dir hilft? Vielen Dank ! – Moltes

+0

Habt ihr herausgefunden, wie man das umsetzt? Ich bin auch in derselben Situation. – Sannu

Antwort

3

Für das, was ich gelesen habe es einfacher sein, die neuen Interface-Methoden zu sagen, was von @query Anmerkung zu tun, und nicht die Mühe, sich mit BeanFactory oder 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

Wenn das nicht für Sie gilt und Sie sagen, dass Ihr Code mit einem Repository funktioniert, aber fehlschlägt, wenn Sie einen zweiten hinzufügen, ist der erste Versuch, den Umfang der Bean auf Prototyp zu setzen, aber das ist nur eine Spekulation. Es tut mir leid, wenn ich nicht wirklich geholfen habe, hasse mich nicht zu viel ^^

Verwandte Themen