2010-01-05 10 views
5

Ich habe ein Stück von Wartungscode, der an bestimmten Zeitpunkten wählen Privilegien auf einen bestimmten Benutzer erteilen sollte:bekommen alle abgebildeten Einheiten von EnitityManager

grant select on A_DB.A_TABLE to READ_ONLY_USER; 

Ich möchte für alle Tabellen, dies zu tun. Ich könnte select * from tab in Oracle oder show tables in MySQL verwenden, um die vollständige Liste zu erhalten und dann weiter so zu gehen.

Aber da ich bereits das javax.persistence.EntityManager Objekt zur Hand habe, habe ich mich gefragt, ob es einen anderen Weg gibt, um alle gemappten Entitäten zu bekommen, von denen der Manager weiß (ich benutze Hibernate unter der Haube).

+0

Sie können dies überprüfen :: http://stackoverflow.com/questions/ 43604928/hibernate-upgrade-to-5-2-session-factory-creation-and-replacing-persistentclas/43718626 –

Antwort

9

Es gibt zwei Möglichkeiten, die ich sehen kann, alle der abgebildeten Personen und ihre entsprechenden SQL-Tabellen bekommen (es können andere sein).

Die straightfoward ist, wenn Sie Ihr Hibernate Konfigurationsobjekt verwenden können:

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

Alternativ können Sie ein wenig mehr Casting tun und die gleichen Informationen bekommen auch aus der Session:

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

Ich kann nicht zur Hibernate-Konfiguration, aber die zweite Lösung funktioniert. – raoulsson

0

prüfen, was in diesem Map verfügbar ist:

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

Die Klassenmetadaten sind tatsächlich auf die Eigenschaften der Entität selbst beschränkt und enthalten keine Mapping-bezogenen Daten. Dies wäre in Ordnung, wenn die DB-Tabellen die gleichen Namen wie die Entitäten haben. – BryanD

+0

Nun, es sieht aus wie GetAllClassMetadata die Lösung gesucht wurde. Ihre Antwort war natürlich detaillierter. Ich sollte vielleicht keine Hinweise geben, aber komplette Lösungen. Trotzdem habe ich das Gefühl, dass etwas nicht stimmt :) – Bozho

0

Wenn Sie javax.persistence.EntityManager in der Hand haben, kann die folgende Methode Ihnen helfen, alle Tabellennamen aufzulisten:

5

Ab 2016 (Hibernate 5.2) sind sowohl getAllClassMetadata als auch Configuration veraltet.

Ich denke, das stattdessen verwendet werden könnte:

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

In besonderen, die Klassen zu erhalten:

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

Migrieren von HIbernate 3 zu 5.2.10. Ich muss von "entities", wie Sie es definiert haben, zu PersistentClass gelangen. Ist das möglich? – Vering

+0

Siehe meine Antwort hier: http://stackoverflow.com/questions/32780664/hibernate-migration-from-4-3-x-to-5-x-for-method-org-hibernate-cfg-configuration/43653061# 43653061 – Vering

Verwandte Themen