有没有一种方法可以从EntityManager获取所有托管实体?

21

我正在设置一个基本的测试数据工具,并希望跟踪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个回答

25

我认为这可能会有帮助:

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信息。


3
对于其他路过的人:变量名“className”有点误导,因为它实际上是jpaEntityName。要获取实际类,应该使用getBindableJavaType。@Faisal,感谢您指引我正确的方向。 - Ittai
8
我不确定这是否符合原帖的要求。它似乎打印了可以从数据库中获取的所有实体,但没有打印当前由EntityManager管理的所有实体。 - Marcus Junius Brutus
1
这完全是错误的!正如@MarcusJuniusBrutus所指出的那样,这会从数据库加载所有已知实体的所有行。当代码完成时,您实际上可以掌握所有已加载的实体。但这些不是在执行代码之前管理的实体。 - BetaRide

3

您使用的是哪个JPA提供程序?

JPA API中没有关于此的内容。

如果使用EclipseLink,您可以使用以下代码:

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

1
对于Hibernate,您可以使用https://dev59.com/Q2Qn5IYBdhLWcg3w7ayK - Foumpie

1
如果您需要删除测试期间插入的所有实体,可以在事务内执行测试,然后回滚该事务。请参见9.3.5.4 事务管理,了解此方法的示例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接