有没有办法从EntityManager获取所有托管实体

Th3*_*m4n 15 persistence entity-relationship jpa

我正在设置一个基本的测试数据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);
}
Run Code Online (Sandbox Code Playgroud)

我想要这样的东西;

EntityManager em;

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

不确定这是否可行,但我只想知道经理知道它在管理什么?或者,如果您有任何想法可以轻松管理一堆实体.

Fai*_*roz 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);
}
Run Code Online (Sandbox Code Playgroud)

基本上EntityManager :: MetaModel包含有关所管理实体的MetaData信息.

  • 我不确定OP的要求是什么.它似乎打印了可以从数据库中获取的所有实体,但不是所有当前由EntityManager管理的实体. (5认同)
  • 对于任何其他路过的人:变量名"className"误导了我一点,因为它实际上是jpaEntityName.要获得实际的类,应该使用getBindableJavaType.@Faisal,谢谢你指点我正确的方向 (3认同)