Wie kann ich alle @Entity-Klassen von einer Persistence Unit erhalten?

Problem

Ich schreibe ein eigenständiges Hilfsprogramm, das in einem Jar mit einer mit JPA-2-Anmerkungen versehenen Persistenzeinheit programmgesteuert eine Liste aller @Entity-Klassen in einer bestimmten Persistenzeinheit abrufen muss.

Ich möchte entscheiden, welcher von zwei Ansätzen der Weg ist, um diese Informationen zu erhalten, und warum. oder ob es einen anderen besseren Weg gibt, an den ich nicht gedacht habe.

Lösung 1

Das Java-Programm fügt jar in den Klassenpfad ein und erstellt mithilfe von JavaSE-Methoden eine Persistenzeinheit aus den Klassen im jar. Anschließend werden die Klassen javax.persistence verwendet, um das JPA-Metamodell abzurufen und eine Liste der Klassentoken daraus abzurufen.

<code>EntityManagerFactory emf = Persistence.createEntityManagerFactory("MY_ PERSISTENCE_UNIT");
Metamodel mm = emf.getMetamodel();

// loop these, using getJavaType() from Type sub-interface to get 
// Class tokens for managed classes.
mm.getManagedTypes();
</code>
Lösung 2

Das Programm durchsucht die Verzeichnisse und Dateien in der angegebenen JAR-Datei nach persistence.xml-Dateien und findet dann eines mit dem angegebenen Namen der Persistenzeinheit. Dann XPath die Datei, um die Liste zu erhalten<class> XML-Elemente und lesen Sie die vollqualifizierten Klassennamen von dort. Erstellen Sie aus Namen Klassentoken.

Einschränkungen / BedenkenIch würde gerne mit Ansatz 1 weitermachen, wenn dies möglich ist.Dieses Dienstprogramm wird NICHT in einem Container ausgeführt, aber die JAR-Datei ist ein EJB-Projekt, das für die Ausführung in einem Container konzipiert wurde. Wie wird das ein Problem sein?Das Dienstprogramm verfügt über Open-EJB im Klassenpfad, um Implementierungen aller Java EE 6-Klassen abzurufen.Obwohl das EJB-Projekt für die Ausführung im Ruhezustand erstellt wurde, sollte das Dienstprogramm nicht für den Ruhezustand spezifisch sein.Gibt es Stolpersteine?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage