2010-01-05 24 views
5

que tiene un pedazo de código de mantenimiento que deben conceder privilegios a un usuario determinado en ciertos puntos de tiempo:Conseguir todas las entidades asignadas a EnitityManager

grant select on A_DB.A_TABLE to READ_ONLY_USER; 

Quiero hacer esto para todas las tablas. Podría usar select * from tab en Oracle o show tables en MySQL para obtener la lista completa y luego seguir así.

Pero como ya tengo el objeto javax.persistence.EntityManager a mano, me pregunté si hay otra forma de obtener todas las entidades asignadas, el administrador sabe (estoy usando Hibernate bajo el capó).

+0

Esto se puede comprobar :: http://stackoverflow.com/questions/ 43604928/hibernate-upgrade-to-5-2-session-factory-creation-and-replace-persistentclas/43718626 –

Respuesta

9

Hay dos maneras en que puedo conseguir ver todas las entidades asignadas y sus correspondientes tablas de SQL (puede haber otros).

El más straightfoward es si se puede utilizar el objeto de configuración de Hibernate:

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

Alternativamente, se puede hacer un poco más de fundición y obtener esta misma información de la SessionFactory también:

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

No puedo acceder a la configuración de Hibernate, pero la segunda solución funciona. – raoulsson

0

Comprobar lo que está disponible en este Map:

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

Los metadatos de la clase están realmente limitados a las propiedades de la entidad misma y no contienen ningún dato relacionado con la asignación. Esto estaría bien si las tablas DB se nombran igual que las Entidades. – BryanD

+0

bueno, parece que getAllClassMetadata fue la solución buscada. Tu respuesta fue más detallada, por supuesto ... Tal vez no debería dar pistas, sino soluciones completas. Aún así, siento que hay algo mal con eso :) – Bozho

0

Si tiene javax.persistence.EntityManager en la mano., El siguiente método puede ayudarlo a obtener una lista de todos los nombres de tabla:

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

A partir de 2016 (Hibernate 5.2), ambos getAllClassMetadata y Configuration están en desuso.

supongo que esto se podría utilizar en su lugar:

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

En especial, para obtener las clases:

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

Migración de HIbernate 3 a 5.2.10. Necesito pasar de "entidades" como definiste a PersistentClass. ¿Es eso posible? – Vering

+0

Ver mi respuesta aquí: http://stackoverflow.com/questions/32780664/hibernate-migration-from-4-3-x-to-5-x-for-method-org-hibernate-cfg-configuration/43653061# 43653061 – Vering

Cuestiones relacionadas