有没有办法检索由SessionFactory
管理的所有表的名称?例如,通过AnnotationConfiguration.addAnnotatedClass(...))
?
答案 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