2011-03-08 15 views
13

Estoy configurando una utilidad básica de datos de prueba y quiero hacer un seguimiento de todos los datos manejados por EntityManager. En lugar de tener un montón de listas para cada entidad, ¿hay alguna forma de obtener todo lo que gestiona EntityManager de una sola vez?¿Hay alguna manera de obtener todas las entidades administradas desde EntityManager?

Así que en lugar de esto:

EntityManager em; 
List<Entity1> a; 
List<Entity2> b; 
... 
List<Entityn> n; 

cleanup() { 
    for(Entity1 e : a) em.remove(e); 
    for(Entity2 f : b) em.remove(f); 
    ... 
    for(Entityn z : n) em.remove(z); 
} 

Quiero algo como esto;

EntityManager em; 

cleanup() { 
    List<Object> allEntities = em.getAllManagedEntities(); //<-this doesnt exist 
    for(Object o : allEntities) em.remove(o); 
} 

No estoy seguro de si esto es posible, pero me imagino que el gerente sabe lo que está gestionando? O bien, si tiene alguna idea de administrar un grupo de entidades fácilmente.

Respuesta

20

Creo que esto podría ayudar a:

for (EntityType<?> entity : entityManager.getMetamodel().getEntities()) { 
    final String className = entity.getName(); 
    log.debug("Trying select * from: " + className); 
    Query q = entityManager.createQuery("from " + className + " c"); 
    q.getResultList().iterator(); 
    log.debug("ok: " + className); 
} 

Básicamente EntityManager :: metamodelo contiene la información de metadatos en relación con las entidades gestionadas.

+3

Para Alguien más que pasa: el nombre de la variable "className" me confunde un poco ya que en realidad es el jpaEntityName. Para obtener la clase real, uno debe usar getBindableJavaType. @Faisal, gracias por apuntarme en la dirección correcta – Ittai

+3

No estoy seguro de que haga lo que el OP solicitó. Parece imprimir todas las entidades que se pueden obtener de la base de datos, pero no todas las entidades que * actualmente * son administradas por EntityManager. –

+0

¡Esto simplemente está mal! Como @MarcusJuniusBrutus ya está señalando, esto carga todas las filas de todas las entidades conocidas de la base de datos. Cuando el código finalice, puede obtener una mano en todas las entidades cargadas. Pero estas no son las entidades que se administraron antes de ejecutar el código. – BetaRide

1

Si necesita eliminar todas las entidades insertadas durante una prueba, puede ejecutar la prueba dentro de una transacción y luego deshacer esa transacción. Ver 9.3.5.4 Transaction management como un ejemplo de este enfoque.

4

¿Qué proveedor de JPA estás utilizando?

No hay nada en la API de JPA para esto.

Si se utiliza EclipseLink, puede utilizar,

em.unwrap(UnitOfWorkImpl.class).getCloneMapping().keySet() 
+0

Y para Hibernate puede usar https://stackoverflow.com/questions/16460796/hibernate-how-to-get-a-list-of-all-the-objects- current-in-the-session – Foumpie

Cuestiones relacionadas