Есть ли способ получить все управляемые объекты из EntityManager - PullRequest
14 голосов
/ 08 марта 2011

Я настраиваю утилиту базовых тестовых данных и хочу отслеживать все данные, которые обрабатывает EntityManager.Вместо того, чтобы просто иметь несколько списков для каждой сущности, есть ли способ получить все, что управляется EntityManager, одним махом?

Итак, вместо этого:

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

Я хочучто-то вроде этого;

EntityManager em;

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

Не уверен, что это возможно, но я просто представляю, что менеджер знает, чем он управляет?Или, если у вас есть идеи, как легко управлять группой объектов.

Ответы [ 3 ]

20 голосов
/ 13 августа 2011

Я думаю, что это может помочь:

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

В основном EntityManager :: MetaModel содержит информацию MetaData, касающуюся управляемых сущностей.

4 голосов
/ 08 марта 2011

Каким JPA-провайдером вы пользуетесь?

Для этого нет ничего в JPA API.

Если вы используете EclipseLink, вы можете использовать,

em.unwrap(UnitOfWorkImpl.class).getCloneMapping().keySet()
1 голос
/ 08 марта 2011

Если вам нужно удалить все объекты, вставленные во время теста, вы можете выполнить тест внутри транзакции и затем откатить эту транзакцию.См. 9.3.5.4 Управление транзакциями в качестве примера такого подхода.

...