Получение всех сопоставленных сущностей из EnitityManager - PullRequest
5 голосов
/ 05 января 2010

У меня есть фрагмент кода обслуживания, который должен предоставлять привилегии выбора определенному пользователю в определенные моменты времени:

grant select on A_DB.A_TABLE to READ_ONLY_USER;

Я хочу сделать это для всех таблиц. Я мог бы использовать select * from tab в Oracle или show tables в MySQL, чтобы получить полный список, а затем двигаться дальше.

Но поскольку у меня уже есть объект javax.persistence.EntityManager, я подумал, есть ли другой способ получить доступ ко всем сопоставленным сущностям, о которых знает менеджер (я использую Hibernate под капотом).

Ответы [ 4 ]

9 голосов
/ 05 января 2010

Есть два способа получить все сопоставленные сущности и соответствующие им таблицы 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);
    }
7 голосов
/ 08 июня 2016

По состоянию на 2016 г. (Hibernate 5.2) как getAllClassMetadata, так и Configuration устарели.

Полагаю, это можно использовать вместо:

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

Специально, чтобы получить классы:

List<?> classes = entities.stream()
                          .map(EntityType::getJavaType)
                          .filter(Objects::nonNull)
                          .collect(Collectors.toList());
0 голосов
/ 15 ноября 2014

Если у вас есть 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;
}
0 голосов
/ 05 января 2010

Проверьте, что доступно в этом Map:

((Session) entityManager.getDelegate()).getSessionFactory().getAllClassMetadata() ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...