Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从EntityManager获取所有映射实体_Java_Database_Hibernate_Data Binding_Persistence - Fatal编程技术网

Java 从EntityManager获取所有映射实体

Java 从EntityManager获取所有映射实体,java,database,hibernate,data-binding,persistence,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对象,我想知道是否有其他方法可以获取管理器知道的所有映射实体(我正在使用Hibernat

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

grant select on A_DB.A_TABLE to READ_ONLY_USER;
我想对所有的桌子都这样做。我可以在Oracle中使用
select*from-tab
,或者在MySQL中使用
show tables
,以获得完整的列表,然后继续这样做


但是,由于我手头已经有了
javax.persistence.EntityManager
对象,我想知道是否有其他方法可以获取管理器知道的所有映射实体(我正在使用Hibernate)

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

有两种方法可以获取所有映射实体及其对应的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);
    }
Map Map=(Map)sessionFactory.getAllClassMetadata();
for(字符串entityName:map.keySet()){
SessionFactoryImpl sfImpl=(sessionfactorympl)sessionFactory;
字符串tableName=((AbstractEntityPersister)sfImpl.GetEntityTypersister(entityName)).getTableName();
System.out.println(entityName+“\t”+表名);
}

如果您手头有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;
}
private List getAllTables(){
List tableNames=new ArrayList();
Session Session=entityManager.unwrap(Session.class);
SessionFactory SessionFactory=session.getSessionFactory();
Map Map=(Map)sessionFactory.getAllClassMetadata();
for(字符串entityName:map.keySet()){
SessionFactoryImpl sfImpl=(sessionfactorympl)sessionFactory;
字符串tableName=((AbstractEntityPersister)sfImpl.GetEntityTypersister(entityName)).getTableName();
tableName.add(tableName);
}
返回表名;
}
自2016年(Hibernate 5.2)起,
getAllClassMetadata
Configuration
都已弃用。

我想可以用这个来代替:

Set<EntityType<?>> entities = sessionFactory.getMetamodel().getEntities();
Set classes=entities.stream()
.map(EntityType::getJavaType)
.filter(对象::非空)
.collect(Collectors.toList());

正如MarcG answer所说的那样,
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)));
        }
 }
MetamodelImplementor metaModelImpl=(MetamodelImplementor)会话。getMetamodel();
Map entityPersisters=metaModelImpl.entityPersisters();
Collection val=entityPersisters.values();
对于(EntityPersister ep:val){
AbstractEntityPersister aep=(AbstractEntityPersister)ep;
System.out.println(aep.getTableName());
System.out.println(Arrays.toString(aep.getIdentifierColumnNames());
for(字符串propName:aep.getPropertyNames()){
System.out.println(propName);
System.out.println(Arrays.toString(aep.getPropertyColumnNames(propName));
}
}

类元数据实际上仅限于实体本身的属性,不包含任何与映射相关的数据。如果DB表的名称与实体的名称相同,这就没问题了。好吧,看起来getAllClassMetadata是寻求的解决方案。当然,你的回答更详细。。我或许不应该给出提示,但应该给出完整的解决方案。尽管如此,我还是觉得有点不对劲:)我无法进入Hibernate配置,但第二个解决方案是有效的。从Hibernate 3过渡到5.2.10。我需要从您定义的“实体”到PersistentClass。这可能吗?请看我的回答:空检查是怎么回事,我们什么时候从getJavaType方法中得到空的JavaType?您可以检查这个::
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)));
        }
 }