从EntityManager获取所有映射的实体

时间:2010-01-05 15:39:44

标签: java database hibernate data-binding persistence

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

grant select on A_DB.A_TABLE to READ_ONLY_USER;

我想为所有表格执行此操作。我可以在Oracle中使用select * from tab或在MySQL中使用show tables来获取完整列表,然后继续前进。

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

5 个答案:

答案 0 :(得分:9)

我可以通过两种方式获取所有映射实体及其相应的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<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);
    }

答案 1 :(得分:6)

截至2016年(Hibernate 5.2),getAllClassMetadataConfiguration均已弃用。

我想这可以用来代替:

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

特别的,要获得课程:

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

答案 2 :(得分:1)

正如 MarcG 的回答所说,getAllClassMetadata() 从几年前就被弃用了

截至 Hibernate - 5.4.30.Final - 2021 年 3 月 19 日发布 下面的代码有效并且不推荐使用

MetamodelImplementor metaModelImpl = (MetamodelImplementor)session.getMetamodel();
Map<String, EntityPersister> entityPersisters = metaModelImpl.entityPersisters();
Collection<EntityPersister> val = entityPersisters.values();               

for (EntityPersister ep : val) {
        AbstractEntityPersister aep = (AbstractEntityPersister)ep;

        System.out.println(aep.getTableName());
        System.out.println(Arrays.toString(aep.getIdentifierColumnNames()));
        for (String propName : aep.getPropertyNames()) {
               System.out.println(propName);
               System.out.println(Arrays.toString(aep.getPropertyColumnNames(propName)));
        }
 }

答案 3 :(得分:0)

查看此Map

中的可用内容
((Session) entityManager.getDelegate()).getSessionFactory().getAllClassMetadata() ;

答案 4 :(得分:0)

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