2011-03-08 4 views
13

Sto configurando un dato di prova di base util e voglio tenere traccia di tutti i dati gestiti da EntityManager. Piuttosto che avere un gruppo di liste per ogni entità, c'è un modo per prendere tutto ciò che viene gestito da EntityManager in un colpo solo?C'è un modo per ottenere tutte le entità gestite da un EntityManager

Così, invece di questo:

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

voglio qualcosa di simile;

EntityManager em; 

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

Non sono sicuro se questo è possibile, ma ho appena farebbe immagine che il manager sa cosa sia la gestione? Oppure, se hai qualche idea di gestire facilmente un gruppo di entità.

risposta

20

Penso che questo potrebbe aiutare:

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

Fondamentalmente EntityManager :: metamodel contiene le informazioni dei metadati delle entità gestite.

+3

Per qualcun altro che passa: Il nome variabile "className" mi fuorvia un po 'in quanto è in realtà il jpaEntityName. Per ottenere la vera classe si dovrebbe usare getBindableJavaType. @Faisal, grazie per avermi indicato nella giusta direzione – Ittai

+3

Non sono sicuro che faccia quello che l'OP chiedeva. Sembra stampare tutte le entità che possono essere recuperate dal database, ma non tutte le entità * attualmente * gestite da EntityManager. –

+0

Questo è semplicemente sbagliato! Come @MarcusJuniusBrutus sta già segnalando, carica tutte le righe di tutte le entità conosciute dal DB. Quando il codice finisce, puoi effettivamente ottenere una mano su tutte le entità caricate. Ma queste non sono le entità che sono state gestite prima dell'esecuzione del codice. – BetaRide

1

Se è necessario rimuovere tutte le entità inserite durante un test, è possibile eseguire il test all'interno di una transazione e quindi eseguire il rollback della transazione. Vedere 9.3.5.4 Transaction management come esempio di questo approccio.

4

Quale provider JPA stai utilizzando?

Non c'è nulla nell'API JPA per questo.

Se si utilizza EclipseLink, è possibile utilizzare,

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

E per Hibernate è possibile utilizzare https://stackoverflow.com/questions/16460796/hibernate-how-to-get-a-list-of-all-the-objects-corrently-in-the-session – Foumpie