2011-03-08 25 views
13

Temel bir test verileri kullanıyorum ve EntityManager'ın kullandığı tüm verileri takip etmek istiyorum. Her varlık için yalnızca bir grup listelere sahip olmak yerine EntityManager tarafından yönetilen her şeyi bir düştü? Bunun yerine buBir EntityManager'dan tüm yönetilen varlıkları elde etmenin bir yolu var

:

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

Böyle bir şey istiyorum;

EntityManager em; 

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

bu mümkündür, ancak emin değil ben sadece olurdu görüntü yöneticisi o yönetme olduğunu bilir? Ya da, bir grup varlıkları kolayca yönetme fikriniz varsa.

cevap

20

ben bu yardımcı olabileceğini düşündüğümüz:

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

Temelde EntityManager :: metamodel yönetilen varlıkları ile ilgili MetaData bilgilerini içerir.

+3

başka biri tarafından geçiriliyor: "className" değişken adı, jpaEntityName olduğu için beni biraz yanlış yönlendiriyor. Gerçek sınıfı almak için getBindableJavaType kullanmalısınız. @Faisal, bana doğru yönde işaret ettiğin için teşekkürler – Ittai

+3

Bunun için OP'nin istediğinden emin değilim. Veritabanından alınabilecek tüm varlıkları yazdırıyor gibi görünüyor, ancak * şu anda EntityManager tarafından yönetilen tüm varlıklar değil. –

+0

Bu sadece yanlış yanlış! @MarcusJuniusBrutus zaten işaret ediyor gibi, bu DB bilinen tüm varlıkların tüm satırlarını yükler. Kod bittiğinde, tüm yüklü öğeler üzerinde bir el alabilirsiniz. Ancak bu, kodu çalıştırmadan önce yönetilen varlıklar değildir. – BetaRide

1

Test sırasında eklenen tüm varlıkları kaldırmanız gerekiyorsa, testi bir işlem içinde yürütebilir ve ardından bu işlemi geri alabilirsiniz. Bu yaklaşımın bir örneği olarak bkz. 9.3.5.4 Transaction management .

4

Hangi JPA sağlayıcılarını kullanıyorsunuz?

Bunun için JPA API'sinde hiçbir şey yoktur.

EclipseLink kullanarak, kullanmak durumunda

,

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

Ve Hazırda Bekletme için https://stackoverflow.com/questions/16460796/hibernate-how-to-get-a-list-of-all-the-objects-currently-in-the-session – Foumpie

İlgili konular