Comment mettre en œuvre un Printemps référentiel de Données pour un @MappedSuperclass

J'ai un APC @MappedSuperClass et un @Entity extension:

@MappedSuperclass
public class BaseClass {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column
    private Boolean active;

    //getters & setters

}

@Entity
public class Worker extends BaseClass{

    @Column
    private String name;

    //getters & setters

}

La active champ de la classe de base est un indicateur pour les enfants des entités. Seuls les actifs doivent être chargés dans l'application. Puis j'ai écrit un générique Printemps de Données interface Proxy:

public interface Dao<T extends BaseClass, E extends Serializable> extends
        CrudRepository<T, E> {

    Iterable<T> findByActive(Boolean active);

}

Et celui-ci est l'interface qui devrait être pour Worker d'accès aux données, correctement l'extension de la précédente:

@Transactional
public interface WorkerDao extends Dao<Worker, Long>{}

Bien, maintenant, dans ma couche logique, j'ai implémenté une classe abstraite qui se terminera le code commun de CRUD opérations au-dessus de mes entités. Je vais avoir un service pour chacun d'eux, mais je veux juste d'hériter de la abstract. Je veux fil du référentiel spécifique pour chacun de ces services et de les fournir à la super-classe à l'aide d'un abstract méthode. C'est la façon dont mon super-classe est mis en œuvre:

public abstract class GenericService<E extends BaseClass>{

    public abstract Dao<E, Long> getDao();

    //Here I've got some common operations for managing 
    //all my application classes, including Worker

}

Le problème est que le getDao() méthode utilise la E paramètre classe, qui est garanti pour être un enfant de BaseClass et pas un javax.persistence.Entity. Lorsque j'essaie d'accéder à la DAO à partir de mon service personnalisé de mise en œuvre, j'obtiens cette erreur:

Causés par: java.lang.IllegalArgumentException: impossible de créer la requête d'un métamodèle pour la méthode abstraite java.lang.Itérable com.mycompany.de modèle.daos.les interfaces.Dao.findByActive(java.lang.Boolean)!
au org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:93)

Causés par: java.lang.IllegalArgumentException: Pas une entité: la classe com.mycompany.de modèle.BaseClass
au org.mise en veille prolongée.jpa.interne.méta-modèle.MetamodelImpl.entité(MetamodelImpl.java:203)

Qui fait sens, parce que E est défini comme un enfant de BaseClass. Le compilateur me permet d'écrire:

public abstract class GenericService<E extends BaseClass && Entity>

Cependant j'obtiens une erreur dans l'enfant de Service qui dit Worker classe n'est pas compatible avec la signature pour E. Quelqu'un sait comment résoudre ce problème?

qui est garanti pour être un BaseClass Non, il doit être le type de béton gestionnaire spécifie, dans ce cas Worker.
correct. Il est garanti d'être un enfant de BaseClass. Cependant, JPA est à la recherche d'un @Entity et BaseClass est un simple @MappedSuperclass.
Cette question similaire a résolu mon problème. C'était une question de l'annotation de l'abstrait référentiel @NoRepositoryBean. Cette la poste décide ce que je demande, une annotation de type restreints n'est pas possible.

OriginalL'auteur Xtreme Biker | 2014-12-18