2011-03-08 12 views
13

से सभी प्रबंधित इकाइयों को प्राप्त करने का कोई तरीका है, मैं एक मूल परीक्षण डेटा उपयोग स्थापित कर रहा हूं और 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); 
} 

यह सुनिश्चित नहीं है कि यह संभव है, लेकिन मैं बस छवि दूंगा कि प्रबंधक जानता है कि यह क्या प्रबंधित कर रहा है? या, यदि आपके पास आसानी से इकाइयों का एक गुच्छा प्रबंधन करने का कोई विचार है।

उत्तर

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 :: मेटामॉडल संस्थाओं में कामयाब के बारे में मेटाडेटा जानकारी शामिल है।

+3

के लिए किसी और द्वारा गुज़रने वाले: परिवर्तनीय नाम "className" मुझे थोड़ा सा गुमराह करता है क्योंकि यह वास्तव में jpaEntityName है। वास्तविक वर्ग प्राप्त करने के लिए किसी को GetBindableJavaType का उपयोग करना चाहिए। @ फैसल, सही दिशा में मुझे इंगित करने के लिए धन्यवाद – Ittai

+3

मुझे यकीन नहीं है कि ओपी ने क्या पूछा है। ऐसा लगता है कि डेटाबेस से प्राप्त की जा सकने वाली सभी इकाइयों को मुद्रित किया जा सकता है, लेकिन सभी संस्थाएं जो वर्तमान में * EntityManager द्वारा प्रबंधित नहीं हैं। –

+0

यह सिर्फ सादा गलत है! जैसा कि @ मर्कस ज्यूनियस ब्रूटस पहले से ही इंगित कर रहा है, यह डीबी से सभी ज्ञात इकाइयों की सभी पंक्तियों को लोड करता है। जब कोड समाप्त होता है तो आप वास्तव में सभी भारित इकाइयों पर हाथ प्राप्त कर सकते हैं। लेकिन यह ऐसी संस्थाएं नहीं हैं जहां कोड को निष्पादित करने से पहले प्रबंधित किया गया था। – BetaRide

1

यदि आपको किसी परीक्षण के दौरान डाली गई सभी संस्थाओं को हटाने की आवश्यकता है, तो आप लेनदेन के अंदर परीक्षण निष्पादित कर सकते हैं और फिर लेनदेन को रोलबैक कर सकते हैं। इस दृष्टिकोण के उदाहरण के रूप में 9.3.5.4 Transaction management देखें।

4

आप किस जेपीए प्रदाता का उपयोग कर रहे हैं?

इसके लिए जेपीए एपीआई में कुछ भी नहीं है।

तो EclipseLink उपयोग कर, आप उपयोग कर सकते हैं,

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

और हाइबरनेट के लिए आप उपयोग कर सकते https://stackoverflow.com/questions/16460796/hibernate-how-to-get-a-list-of-all-the-objects-currently-in-the-session – Foumpie

संबंधित मुद्दे