Die einfachste Möglichkeit, programmgesteuert zu überprüfen, ob eine Klasse eine gültige JPA-Definition hat
-
20-09-2019 - |
Frage
Ich arbeite mit vielen Klassen, die mit Anmerkungen versehen sind javax.persistence.Entity
und dergleichen.In meinem Projekt geht es um die Generierung von Metadaten zu JPA-annotierten Klassen und nicht um die Persistenz an sich, daher verwende ich sie als Testfälle.
Anstatt Hibernate oder einen anderen JPA-Anbieter zu starten, möchte ich im Rahmen meiner Komponententests programmgesteuert überprüfen, ob meine JPA-Deklarationen tatsächlich gültig sind.
Wie geht das am einfachsten?
Lösung
Erstellen Sie einfach die einfachste mögliche SessionFactory
oder was auch immer Eclipse oder OpenJPA hinter dem EntityManagerFactory
bieten und lassen Sie sie es bestätigen (einige Dummy-In-Memory-Datenbank, falls erforderlich). Es ist zu komplex, es neu zu erfinden.
Für Hibernate kann dies über Configuration.buildMappings
getan werden:
@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();
}
}
Andere Tipps
Was ist falsch über einen konkreten JPA-Provider in Ihren Tests verwenden? In Kombination mit einer eingebetteten Datenbank (zum Beispiel Apache Derby) könnten Sie Logik wiederverwenden, die in der Tat wurde bereits umgesetzt. Eine weitere Idee wäre es, die Quellen von Eclipselink zu überprüfen, Hibernate, OpenJPA, ... um zu sehen, ob Sie es direkt verwenden können.
Ich bin mir nicht sicher, ob es ein einfacherer Weg, aber man kann Reflection verwenden, um die Anmerkungen eine Klasse
zuzugreifenClass class = Example.class;
Annotation[] annotations = class.getAnnotations();
Wenn Sie JPA-Anbietern nicht vertrauen (oder sie nicht verwenden möchten), versuchen Sie, mithilfe von Reflection abgerufene JPA-Annotationen (Metadaten) mit abgerufenen JDBC-Metadaten abzugleichen ResultSetMetaData (zum Beispiel siehe Hier).
Ich meine das nicht einfach, aber mit dem richtigen Ansatz sollten Sie über einen recht kompakten Satz von Hilfsmethoden verfügen, um grundlegende Definitionen für jede Entität zu überprüfen.Und die Kilometerzahl kann variieren, je nachdem, wie viel JPA-Funktionalität Sie abdecken möchten.