tutorial relaciones query namedquery insertar example español ejemplos datos create con java java-ee jpa jpa-2.0

java - relaciones - jpa tutorial



¿Cómo puedo obtener todas las clases de @Entity desde una unidad de persistencia? (2)

Problema

Estoy escribiendo un programa de utilidad independiente que, dado un contenedor que contiene una unidad de persistencia anotada JPA-2, necesita obtener programáticamente una lista de todas mis clases @Entity en una unidad de persistencia particular.

Me gustaría decidir cuál de los 2 enfoques sería el camino a seguir para obtener esta información, y por qué; o si hay otra forma mejor en la que no haya pensado.

Solución 1

El programa Java pone jar en classpath, crea una unidad de persistencia a partir de las clases en el jar usando metodologías JavaSE. Luego usa las clases javax.persistence para obtener el metamodelo JPA, saca la lista de tokens de clase de eso.

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

Solución 2

Programa escanear los directorios y archivos dentro del archivo jar especificado para archivos persistence.xml, luego encuentra uno con el nombre de unidad de persistencia especificado. A continuación, XPath el archivo para obtener la lista de elementos XML de <class> y leer los nombres de clase totalmente calificados a partir de allí. De nombres, construir tokens de clase.

Restricciones / Preocupaciones

  • Me gustaría ir con el enfoque 1 si es posible.
  • Esta utilidad NO se ejecutará dentro de un contenedor, pero el contenedor es un proyecto EJB diseñado para ejecutarse dentro de uno. ¿Cómo será esto un problema?
  • La utilidad tendrá Open-EJB disponible en classpath para obtener implementaciones de todas las clases de Java EE 6.
  • Aunque el proyecto EJB está diseñado para ejecutarse en Hibernate, la utilidad no debe ser específica de Hibernate.
  • ¿Hay algún obstáculo?

Si su jar está bien formado (persistence.xml en el lugar correcto, en la carpeta META-INF), todo se ve bien.

No es necesario ejecutar su utilidad dentro de un contenedor, JPA no forma parte de las especificaciones de JavaEE.


En caso de que alguien esté interesado, la Solución 1 funcionó. Esto es esencialmente lo que tuve que hacer:

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 } }

La clave era anular mi tipo de transacción y borrar el jtaDataSource que se había definido en mi persistence.xml. Resulta que todo lo demás era innecesario.