Die einfachste Möglichkeit, programmgesteuert zu überprüfen, ob eine Klasse eine gültige JPA-Definition hat

StackOverflow https://stackoverflow.com/questions/2262819

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?

War es hilfreich?

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

zuzugreifen
Class 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top