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

Problem

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

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

Solution 1

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

<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>
Solution 2

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

Constraints/Concerns I'd like to go with approach 1 if possible. This utility will NOT run inside a container, but the jar is an EJB project designed to run inside one. How will this be a problem? The utility will have Open-EJB available on the classpath to get implementations of all the Java EE 6 classes. Even though the EJB project is built to run on Hibernate, the utility should not be Hibernate-specific. Are there any stumbling blocks?
 Thufir12 апр. 2012 г., 05:13
Выглядит хорошо для меня, но я новичок в этом. Как выглядит ваш контроллер?

Ответы на вопрос(2)

если кто-то заинтересован, решение 1 сработало. Вот что я должен был сделать по существу:

public MySQLSchemaGenerator() throws ClassNotFoundException {
    Properties mySQLDialectProps = new Properties();
    mySQLDialectProps.setProperty("javax.persistence.transactionType", "RESOURCE_LOCAL");
    mySQLDialectProps.setProperty("javax.persistence.jtaDataSource", "");

    final EntityManagerFactory emf = Persistence.createEntityManagerFactory("<persistence_unit_name>", mySQLDialectProps);
    final Metamodel mm = emf.getMetamodel();
    for (final ManagedType<?> managedType : mm.getManagedTypes()) {
      managedType.getJavaType(); // this returns the java class of the @Entity object
    }
  }

Ключ должен был переопределить мой тип транзакции и очистить jtaDataSource, который был определен в моем файле persistence.xml. Оказывается, все остальное было ненужным.

Решение Вопроса

папке META-INF), то все выглядит хорошо.

Нет необходимости запускать вашу утилиту внутри контейнера, JPA не является частью спецификаций JavaEE.

 Tom Tresansky13 апр. 2012 г., 18:05
Мой кувшин хорошо сформирован, бобы отлично работают, когда я развернусь на JBoss. Я действительно довольно хорошо продвигаюсь по маршруту 1. Мне нужно было найти способ переопределить набор параметров, таких как Transaction-Type (был установлен JTA, должен быть Resource_Local) в модуле персистентности (если я закомментировал их Утилита работает нормально, но тогда я не могу запустить нормально развернутый на сервере приложений). Осталось несколько проблем с переопределением источника данных ... надеюсь, скоро появится возможность немного поработать над ним и опубликует код, который я получил, когда он полностью заработает.
 29 июл. 2013 г., 20:59
Конечно, JPA является частью спецификации JEE, это JSR. Вы можете запустить его вне JEE-контейнера только потому, что есть какая-то отдельная реализация, такая как hibernate. (hibernate - это не просто реализация JPA, она существовала до спецификации, они просто обеспечивали соответствие)

Ваш ответ на вопрос