代码之家  ›  专栏  ›  技术社区  ›  raoulsson

从EnittyManager获取所有映射的实体

  •  5
  • raoulsson  · 技术社区  · 15 年前

    我有一段维护代码,应该在特定的时间点授予特定用户选择权限:

    grant select on A_DB.A_TABLE to READ_ONLY_USER;
    

    我想为所有的桌子做这个。我可以用 select * from tab 在Oracle或 show tables 在mysql中获取完整的列表,然后继续这样做。

    但既然我已经有了 javax.persistence.EntityManager 对象在手边,我想知道是否还有其他方法来获取管理者所知道的所有映射实体(我在引擎盖下使用Hibernate)。

    4 回复  |  直到 9 年前
        1
  •  9
  •   BryanD    15 年前

    有两种方法可以让我看到获取所有映射的实体及其对应的SQL表(可能还有其他方法)。

    最直接的方法是,如果可以使用Hibernate配置对象:

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

    或者,您可以做更多的转换,并从会话工厂获得相同的信息:

        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);
        }
    
        2
  •  6
  •   Marcelo Glasberg    9 年前

    截至2016年(Hibernate 5.2),两者 getAllClassMetadata Configuration 被贬低。

    我想可以用这个来代替:

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

    特别是,要获得课程:

    List<?> classes = entities.stream()
                              .map(EntityType::getJavaType)
                              .filter(Objects::nonNull)
                              .collect(Collectors.toList());
    
        3
  •  0
  •   Bozho    15 年前

    检查这里面有什么 Map :

    ((Session) entityManager.getDelegate()).getSessionFactory().getAllClassMetadata() ;
    
        4
  •  0
  •   Sairam Krish    10 年前

    如果手头有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;
    }