我正在设置一个基本的测试数据util,并希望跟踪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);
}
不确定这是否可行,但我只是想知道经理知道它在管理什么?或者,如果您有任何想法可以轻松管理一堆实体。
答案 0 :(得分:20)
我认为这可能会有所帮助:
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信息。
答案 1 :(得分:4)
您使用的是哪个JPA提供商?
JPA API中没有任何内容可用于此。
如果使用EclipseLink,您可以使用
em.unwrap(UnitOfWorkImpl.class).getCloneMapping().keySet()
答案 2 :(得分:1)
如果需要删除测试期间插入的所有实体,可以在事务中执行测试,然后回滚该事务。见9.3.5.4 Transaction management 作为这种方法的一个例子。