2011-03-08 14 views
13

Konfiguruję podstawowy użytkownik danych testowych i chcę śledzić wszystkie dane obsługiwane przez EntityManager. Zamiast posiadania wielu list dla każdego podmiotu istnieje sposób, aby chwycić wszystko zarządzane przez EntityManager za jednym zamachem?Czy istnieje sposób na uzyskanie wszystkich zarządzanych jednostek z EntityManager

tego Więc zamiast:

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

chcę coś takiego;

EntityManager em; 

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

Nie jestem pewien, czy to jest możliwe, ale tylko by obraz, że menedżer wie, co to jest zarządzający? Lub, jeśli masz jakieś pomysły na łatwe zarządzanie grupą jednostek.

Odpowiedz

20

myślę, że to może pomóc:

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

Zasadniczo EntityManager :: metamodel zawiera informacje metadanych w odniesieniu do podmiotów zarządzanych.

+3

Dla ktokolwiek przechodzi obok: Nazwa zmiennej "className" wprowadza mnie w błąd, ponieważ jest to w rzeczywistości jpaEntityName. Aby uzyskać aktualną klasę należy użyć getBindableJavaType. @Faisal, dzięki za wskazanie mi w dobrym kierunku – Ittai

+3

Nie jestem pewien, czy robi to, co PO chciał. Wydaje się, że drukuje wszystkie jednostki, które można pobrać z bazy danych, ale nie wszystkie podmioty, które * obecnie * są zarządzane przez EntityManager. –

+0

To jest po prostu źle! Jak już wskazuje @MarcusJuniusBrutus, to ładuje wszystkie wiersze wszystkich znanych podmiotów z DB. Kiedy kod się skończy, możesz dostać rękę na wszystkich załadowanych elementach. Ale to nie są podmioty, którymi zarządzano przed wykonaniem kodu. – BetaRide

1

Jeśli chcesz usunąć wszystkie elementy wstawione podczas testu, możesz wykonać test wewnątrz transakcji, a następnie wycofać tę transakcję. Zobacz 9.3.5.4 Transaction management jako przykład tego podejścia.

4

Jakiego dostawcy JPA używasz?

Nie ma nic w tym interfejsie API JPA.

przypadku korzystania EclipseLink można użyć,

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

A dla Hibernate możesz użyć https://stackoverflow.com/questions/16460796/hibernate-how-get-a-list-of-all-the-objects- current-in-thesessing – Foumpie

Powiązane problemy