获取在SessionFactory中设置的所有表名

时间:2011-01-27 05:42:30

标签: java hibernate

有没有办法检索由SessionFactory管理的所有表的名称?例如,通过AnnotationConfiguration.addAnnotatedClass(...))

添加的所有表格

4 个答案:

答案 0 :(得分:12)

以下是如何使用getClassMetadata

获取一个表名
ClassMetadata cm = sessionFactory.GetClassMetadata(className);

AbstractEntityPersister aep = (AbstractEntityPersister) cm;
String tableName = aep.getTableName();

[编辑] :您可以通过调用getAllClassMetadata()找到所有内容并查找所有类似的表名

Map m = sessionFactory.GetAllClassMetadata();
/* iterate map*/
AbstractEntityPersister aep = m.get(/*key (className)*/) 
String tableName = aep.getTableName(); 

答案 1 :(得分:2)

如果你使用JPA而不是直接依赖hibernate。下面的代码应该有助于获取所有表名

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;
}

答案 2 :(得分:1)

您可以尝试使用本机SQL查询。

session.createSQLQuery("SELECT * FROM user_tables").list();

给出了登录用户拥有的表的列表,否则你可以对oracle database的所有表使用'all_tables'或'dba_tables'。如果使用mysql db,则用“SHOW TABLES”替换查询

答案 3 :(得分:0)

sessionFactory.GetClassMetadata(className);

已过时。使用

    Metamodel metamodel = entityManager.getMetamodel();
    Set<EntityType<?>> entities = metamodel.getEntities();

    entities.forEach(e -> {
        System.out.println(e.getName());
    });

您还可以从SessionFactory获取metamodel