rao*_*son 5 java database data-binding persistence hibernate
我有一段维护代码,应该在特定时间点为某个用户授予选择权限:
grant select on A_DB.A_TABLE to READ_ONLY_USER;
Run Code Online (Sandbox Code Playgroud)
我想为所有表格做这个.我可以select * from tab
在Oracle或show tables
MySQL中使用它来获取完整列表然后继续前进.
但是因为我已经掌握了javax.persistence.EntityManager
Object,所以我想知道是否有另一种方法来获取所有映射的实体,Manager知道(我正在使用Hibernate).
我可以通过两种方式获取所有映射实体及其对应的SQL表(可能还有其他表).
最直接的方法是,如果您可以使用您的Hibernate配置对象:
for(Iterator it = config.getClassMappings(); it.hasNext();){
PersistentClass pc = (PersistentClass) it.next();
System.out.println(pc.getEntityName() + "\t" + pc.getTable().getName());
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以进行更多的转换,并从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);
}
Run Code Online (Sandbox Code Playgroud)
作为2016(休眠5.2),两者都getAllClassMetadata
和Configuration
被弃用.
我想这可以用来代替:
Set<EntityType<?>> entities = sessionFactory.getMetamodel().getEntities();
Run Code Online (Sandbox Code Playgroud)
特别是,要获得课程:
List<?> classes = entities.stream()
.map(EntityType::getJavaType)
.filter(Objects::nonNull)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
正如 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)));
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10259 次 |
最近记录: |