2010-01-05 8 views
5

से सभी मैप की संस्थाओं हो रही मैं रखरखाव कोड उस समय के कुछ बिंदुओं पर एक निश्चित उपयोगकर्ता के लिए चयन विशेषाधिकार देते हैं चाहिए का एक टुकड़ा है:EnitityManager

grant select on A_DB.A_TABLE to READ_ONLY_USER; 

मैं सभी तालिकाओं के लिए ऐसा करना चाहते हैं। मैं पूरी सूची प्राप्त करने के लिए MySQL में Oracle या show tables में select * from tab का उपयोग कर सकता हूं और फिर उस तरह आगे बढ़ सकता हूं।

लेकिन चूंकि मेरे पास पहले से javax.persistence.EntityManager ऑब्जेक्ट है, इसलिए मुझे आश्चर्य हुआ कि सभी मैप किए गए इकाइयों को पाने का कोई और तरीका है, प्रबंधक को पता है (मैं हुडनेट के तहत हाइबरनेट का उपयोग कर रहा हूं)।

+0

आप इस जाँच कर सकते हैं :: http://stackoverflow.com/questions/ 43604928/हाइबरनेट-अपग्रेड-टू -5-2-सत्र-फैक्ट्री-निर्माण-और-प्रतिस्थापन-persistentclas/43718626 –

उत्तर

9

दो तरीके है कि मैं मैप की संस्थाओं और उनकी संगत एसक्यूएल टेबल के सभी हो रही देख सकते हैं (वहाँ दूसरों हो सकता है)।

सबसे straightfoward है अगर आप अपने हाइबरनेट विन्यास वस्तु का उपयोग कर सकते हैं: वैकल्पिक रूप से

for(Iterator it = config.getClassMappings(); it.hasNext();){ 
     PersistentClass pc = (PersistentClass) it.next(); 
     System.out.println(pc.getEntityName() + "\t" + pc.getTable().getName()); 
    } 

, तो आप एक छोटे से अधिक कास्टिंग कर सकते हैं और SessionFactory से बाहर भी यह एक ही जानकारी मिलती है:

Map<String, ClassMetadata> map = (Map<String, ClassMetadata>) sessionFactory.getAllClassMetadata(); 
    for(String entityName : map.keySet()){ 
     SessionFactoryImpl sfImpl = (SessionFactoryImpl) sessionFactory; 
     String tableName = ((AbstractEntityPersister)sfImpl.getEntityPersister(entityName)).getTableName(); 
     System.out.println(entityName + "\t" + tableName); 
    } 
+0

मैं हाइबरनेट कॉन्फ़िगरेशन नहीं प्राप्त कर सकता लेकिन दूसरा समाधान काम करता है। – raoulsson

0

चेक क्या इस Map में उपलब्ध है:

((Session) entityManager.getDelegate()).getSessionFactory().getAllClassMetadata() ; 
+0

कक्षा मेटाडाटा वास्तव में इकाई के गुणों तक ही सीमित है और इसमें कोई मैपिंग-संबंधित डेटा नहीं है। यह ठीक होगा अगर डीबी टेबल को इकाइयों के समान नाम दिया गया है। – BryanD

+0

अच्छी तरह से, ऐसा लगता है कि getAllClassMetadata समाधान की मांग की गई थी। आपका जवाब ज़्यादा विस्तृत था, मुझे निश्चित रूप से संकेत देना चाहिए, लेकिन मुझे समाधान नहीं देना चाहिए। फिर भी, मुझे लगता है कि इसमें कुछ गड़बड़ है :) – Bozho

0

यदि आपके पास javax.persistence.EntityManager है। निम्नलिखित विधि आपको सभी तालिका नामों की सूची प्राप्त करने में मदद कर सकती है:

private List<String> getAllTables() { 
    List<String> tableNames = new ArrayList<>(); 
    Session session = entityManager.unwrap(Session.class); 
    SessionFactory sessionFactory = session.getSessionFactory(); 
    Map<String, ClassMetadata> map = (Map<String, ClassMetadata>) sessionFactory.getAllClassMetadata(); 
    for(String entityName : map.keySet()){ 
     SessionFactoryImpl sfImpl = (SessionFactoryImpl) sessionFactory; 
     String tableName = ((AbstractEntityPersister)sfImpl.getEntityPersister(entityName)).getTableName(); 
     tableNames.add(tableName); 
    } 
    return tableNames; 
} 
5

2016 तक (हाइबरनेट 5.2), getAllClassMetadata और Configuration दोनों को बहिष्कृत कर दिया गया है।

मैं इस बजाय प्रयोग किया जा सकता है लगता है:

Set<EntityType<?>> entities = sessionFactory.getMetamodel().getEntities(); 

विशेष में, कक्षाओं में प्राप्त करने के लिए:

List<?> classes = entities.stream() 
          .map(EntityType::getJavaType) 
          .filter(Objects::nonNull) 
          .collect(Collectors.toList()); 
+0

हिबरनेट 3 से 5.2.10 तक माइग्रेटिंग। जैसा कि आपने परिभाषित किया है, मुझे "संस्थाओं" से प्राप्त करने की आवश्यकता है, PersistentClass पर। क्या यह संभव है? – Vering

+0

मेरा उत्तर यहां देखें: http://stackoverflow.com/questions/32780664/hibernate- माइग्रेशन-from-4-3-x-to-5-x-for-method-org-hibernate-cfg-configuration/43653061# 43653061 – Vering