Как я могу получить все классы @Entity из Persistence Unit?

Проблема

Я пишу автономную служебную программу, которая, имея банку, содержащую аннотированный JPA-2 блок сохраняемости, должна программно получить список всех моих классов @Entity в конкретном блоке сохраняемости.

Я хотел бы решить, какой из двух подходов будет способом получить эту информацию и почему; или если есть другой лучший способ, о котором я не думал.

Решение 1

Программа на Java помещает jar в путь к классам, создает единицу персистентности из классов в jar с использованием методологий JavaSE. Затем он использует классы javax.persistence, чтобы получить метамодель JPA, извлечь из нее список токенов классов.

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();

Решение 2

Программа сканирует каталоги и файлы внутри указанного jar-файла на наличие файлов persistence.xml, а затем находит файл с указанным именем модуля сохранения. Затем укажите путь к файлу, чтобы получить список <class>XML-элементов, и прочитайте оттуда полные имена классов. Из имен создавайте токены класса.

Ограничения/проблемы

  • Я хотел бы использовать подход 1, если это возможно.
  • Эта утилита НЕ будет работать внутри контейнера, но jar представляет собой проект EJB, предназначенный для работы внутри контейнера. Как это будет проблемой?
  • Утилита будет иметь Open-EJB, доступный в пути к классам, чтобы получить реализации всех классов Java EE 6.
  • Несмотря на то, что проект EJB создан для работы в Hibernate, утилита не должна быть специфичной-для Hibernate.
  • Есть ли камни преткновения?
14
задан Tom Tresansky 11 April 2012 в 18:36
поделиться