从EnitityManager获取所有映射的实体

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

grant select on A_DB.A_TABLE to READ_ONLY_USER; 

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

但是因为我手头已经有了javax.persistence.EntityManager对象,所以我想知道是否有另一种方法来获取所有映射的实体,管理器知道(我正在使用Hibernate)。

我可以通过两种方式获取所有映射实体及其对应的SQL表(可能还有其他表)。

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

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

或者,您可以进行更多的转换,并从SessionFactory中获取相同的信息:

  Map map = (Map) sessionFactory.getAllClassMetadata(); for(String entityName : map.keySet()){ SessionFactoryImpl sfImpl = (SessionFactoryImpl) sessionFactory; String tableName = ((AbstractEntityPersister)sfImpl.getEntityPersister(entityName)).getTableName(); System.out.println(entityName + "\t" + tableName); } 

截至2016年(Hibernate 5.2),不推荐使用getAllClassMetadataConfiguration

我想这可以用来代替:

 Set> entities = sessionFactory.getMetamodel().getEntities(); 

特别是,要获得课程:

 List classes = entities.stream() .map(EntityType::getJavaType) .filter(Objects::nonNull) .collect(Collectors.toList()); 

检查此Map可用的内容:

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

如果您手头有javax.persistence.EntityManager,以下方法可以帮助您获取所有表名列表:

 private List getAllTables() { List tableNames = new ArrayList<>(); Session session = entityManager.unwrap(Session.class); SessionFactory sessionFactory = session.getSessionFactory(); Map map = (Map) sessionFactory.getAllClassMetadata(); for(String entityName : map.keySet()){ SessionFactoryImpl sfImpl = (SessionFactoryImpl) sessionFactory; String tableName = ((AbstractEntityPersister)sfImpl.getEntityPersister(entityName)).getTableName(); tableNames.add(tableName); } return tableNames; }