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?
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
Vous devez vous connecter pour publier un commentaire.
C'est juste une question de l'annotation de l'abstrait
Repository
comme@NoRepositoryBean
:De cette façon, le Printemps s'appuie sur le référentiel de mise en œuvre pour exécuter le
findByActive
méthode.Quant à l'annotation de restriction de type de problème, il n'est pas possible de déclarer une annotation de type restreints. Voir le référencés réponses ci-dessous.
Voir aussi:
OriginalL'auteur Xtreme Biker