Есть ли способ получить все управляемые объекты из EntityManager
Я настраиваю базовые данные тестовых данных и хочу отслеживать все данные, обрабатываемые 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);
}
Не уверен, что это возможно, но я просто хотел бы, чтобы менеджер знал, что он управляет? Или, если у вас есть идеи управления связкой объектов легко.
Ответы
Ответ 1
Я думаю, это может помочь:
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 относительно управляемых объектов.
Ответ 2
Какой поставщик JPA вы используете?
В JPA API нет ничего для этого.
Если вы используете EclipseLink, вы можете использовать
em.unwrap(UnitOfWorkImpl.class).getCloneMapping().keySet()
Ответ 3
Если вам нужно удалить все объекты, вставленные во время теста, вы можете выполнить проверку внутри транзакции и затем отменить эту транзакцию. См. 9.3.5.4 Управление транзакциями
в качестве примера такого подхода.