Le moyen le plus simple de vérifier par programme qu'une classe a une définition JPA valide
-
20-09-2019 - |
Question
Je travaille avec de nombreuses classes annotées avec javax.persistence.Entity
etc.Mon projet consiste à générer des métadonnées sur les classes annotées JPA plutôt que sur la persistance en elle-même, je les utilise donc comme cas de test.
Plutôt que de lancer Hibernate ou un autre fournisseur JPA, j'aimerais vérifier par programme - dans le cadre de mes tests unitaires - que mes déclarations JPA sont effectivement valides.
Quelle est la façon la plus simple de procéder ?
La solution
Il suffit de créer le plus simple SessionFactory
possible ou tout EclipseLink ou OpenJPA fournissent derrière le EntityManagerFactory
et laissez-les valider (en utilisant une base de données factice en mémoire, le cas échéant). Il est trop complexe pour le réinventer.
Pour Hibernate cela peut être fait en utilisant Configuration.buildMappings
:
@RunWith(Theories.class)
public class EntitiesAreValidTest {
@DataPoints
public static Class<?>[] entities = new Class[] {
SimpleEntity.class,
SimpleEntityWithTransientField.class,
TwoFieldEntity.class
};
@Theory
public void classHasValidConfiguration(Class<?> entityClass) {
new AnnotationConfiguration().addAnnotatedClass(entityClass).buildMappings();
}
}
Autres conseils
Quel est le problème sur l'utilisation d'un fournisseur JPA concret dans vos tests? En combinaison avec une base de données intégrée (par exemple Apache Derby), vous pouvez réutiliser la logique qui a en effet déjà été mis en œuvre. Une autre idée serait de vérifier les sources de EclipseLink, Hibernate, OpenJPA, ... pour voir si vous pouvez l'utiliser directement.
Je ne sais pas s'il y a un moyen plus facile, mais vous pouvez utiliser la réflexion pour accéder aux annotations d'une classe
Class class = Example.class;
Annotation[] annotations = class.getAnnotations();
Si vous ne faites pas confiance aux fournisseurs JPA (ou ne souhaitez pas les utiliser), essayez de réconcilier les annotations JPA (métadonnées) récupérées à l'aide de la réflexion avec les métadonnées JDBC récupérées à l'aide de ResultSetMetaData (voir par exemple ici).
Je ne veux pas dire que cela soit simple, mais avec la bonne approche, vous devriez disposer d'un ensemble plutôt compact de méthodes d'assistance pour vérifier les définitions de base de chaque entité.Et le kilométrage peut varier en fonction de la quantité de fonctionnalités JPA que vous souhaitez couvrir.