Получить имя таблицы, используя имя класса Entity в Hibernate [дубликат]

Вы должны использовать обозначение квадратной скобки, когда -

  1. Имя свойства - это номер. var ob = { 1: 'One', 7 : 'Seven' }
    ob.7 // SyntaxError ob[7] // "Seven"
  2. Имя свойства имеет специальный символ. var ob = { 'This is one': 1, 'This is seven': 7, }
    ob.'This is one' // SyntaxError ob['This is one'] // 1
  3. Имя свойства присваивается переменной, и вы хотите получить доступ к значению свойства этой переменной. var ob = { 'One': 1, 'Seven': 7, } var _Seven = 'Seven'; ob._Seven // undefined ob[_Seven] // 7
28
задан Can Berk Güder 11 March 2009 в 15:40
поделиться

7 ответов

Если вы используете аннотацию Table, вы можете сделать что-то вроде этого:

Table table = Entity.class.getAnnotation(Table.class);
String tableName = table.name();
18
ответ дан Alex Rockwell 26 August 2018 в 16:59
поделиться
  • 1
    Я не (и, честно говоря, я только что узнал об аннотациях), но это хорошая идея. Благодарю. – Can Berk Güder 11 March 2009 в 15:36
  • 2
    Достаточно уверен, что это работает, только если вы задаете аннотацию таблицы для каждого объекта. Спящий режим работает отлично, если вы этого не делаете (он выводит имя из имени объекта) – Justin 13 April 2011 в 07:18

Вы можете получить каждое имя таблицы в своем проекте с помощью этой функции:

public Set<String> getTablesName() {
    Set<String> names = new HashSet<>();
    SessionFactory sessionFactory = emf.unwrap(SessionFactory.class);

    Map<String, ClassMetadata> classMetadataMap = sessionFactory.getAllClassMetadata();
    for (ClassMetadata classMetadata : classMetadataMap.values()) {
        AbstractEntityPersister aep = (AbstractEntityPersister) classMetadata;
        String tableName = aep.getTableName();
        if (StringUtils.isBlank(tableName) || StringUtils.containsWhitespace(tableName)) {
            continue;
        }
        names.add(tableName);
    }
    return names;
}
0
ответ дан Anthony Raymond 26 August 2018 в 16:59
поделиться
  • 1
    Это дает ошибку org.hibernate.SessionFactory.getAllClassMetadata is no longer supported – zygimantus 27 June 2018 в 09:14
  • 2
    Ну, это означает, что этот метод устарел и больше не работает – Anthony Raymond 27 June 2018 в 09:22
Configuration cfg = new Configuration().configure();    
cfg.addResource("com/struts/Entities/User.hbm.xml");
cfg.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
Mappings m=cfg.createMappings();
System.out.println(">> class: "+m.getClass(className));
System.out.println("User table name:: "+m.getClass("User").getTable().getName());
2
ответ дан Can Berk Güder 26 August 2018 в 16:59
поделиться

Используя конфигурацию, вы можете вызвать метод GetClassMapping () для определенного типа, который предоставит вам некоторую информацию о сопоставлении для этого типа.

(По крайней мере, это так в NHibernate, но Я полагаю, что это будет похоже на Hibernate).

1
ответ дан Frederik Gheysels 26 August 2018 в 16:59
поделиться
  • 1
    Да, но как использовать конфигурацию? Могу ли я просто создать новый экземпляр? – Can Berk Güder 11 March 2009 в 17:11
  • 2
    Некоторые параметры - создать новый экземпляр, например, во время инициализации; держите его неподвижным или одиночным; или использовать рефлексию, чтобы захватить ее из SessionFactory. Как только у вас есть конфигурация: configuration.getClassMapping (& quot; foo & quot;). GetTable (). GetName (); – Brian Deterling 11 March 2009 в 18:08

возможно использовать SessionFactory.getClassMetadata ?

0
ответ дан Michael Pralow 26 August 2018 в 16:59
поделиться
  • 1
    Да, я пробовал это, но ClassMetadata, похоже, не содержит никакой информации о таблице – Can Berk Güder 11 March 2009 в 15:22

или отображение списка всех столбцов и всех объектов в графическом интерфейсе, мне нужно было загрузить полный список таблиц, сущностей, атрибутов и имен столбцов, типов, сеттеров, геттеров и даже ярких меток динамически, и именно так я это сделал основанный на решении @Tom Redfem, рефакторинг с потоком java 8:

public void loadHibernateMetadata() throws ClassNotFoundException {
    Map<String, ClassMetadata> hibernateMetadata = sessionFactory.getAllClassMetadata();        

    hibernateMetadata.values()
        .stream()
        .filter(metadata -> metadata != null && metadata instanceof AbstractEntityPersister)
        .map(AbstractEntityPersister.class::cast)
        .forEach( persister -> createNewnParam(persister));
        ;

}

, а затем метод createNewParam:

private void createNewParam(AbstractEntityPersister persister) {
    try {
        Class<?> $class = Class.forName(persister.getEntityName());


        List<String> getterNameRoster = Lists.newArrayList($class.getMethods())
                .stream()
                .filter( method -> method.getName().startsWith("get") || method.getName().startsWith("is"))
                .map(getterName -> getterName.getName())
                .collect(toList())
                ;

        List<String> setterNameRoster = Lists.newArrayList($class.getMethods())
                .stream()
                .filter( method -> method.getName().startsWith("set") )
                .map(setterName -> setterName.getName())
                .collect(toList())
                ;           

        Iterable<AttributeDefinition> attrs = persister.getAttributes();
        attrs.forEach(a -> {        

            String columnName = persister.getPropertyColumnNames(a.getName())[0];
            org.hibernate.type.Type hibernateType =persister.getPropertyType(a.getName());

            Optional<String> optionalGetter = getterNameRoster.stream()
                            .filter(getterStr -> getterStr.equalsIgnoreCase( String.format("get%s", a.getName()) ) ||
                                                 getterStr.equalsIgnoreCase( String.format("is%s", a.getName())) )
                            .findFirst()                                
                            ;

            String getterName = optionalGetter.isPresent() ? optionalGetter.get() : new String("");

            Optional<String> optionalSetter = setterNameRoster.stream()
                                .filter(setterStr -> setterStr.equalsIgnoreCase( String.format("set%s", a.getName()) ))                 
                                .findFirst()                                    
                                ;
            String setterName = optionalSetter.isPresent() ? optionalSetter.get() : new String("");


            Param param = new Param(persister.getEntityName(), 
                                                        persister.getTableName().replaceAll("\"", "").toUpperCase(), 
                                                        columnName.replaceAll("\"", "").toUpperCase(),
                                                        a.getName(),
                                                        getterName, 
                                                        setterName, 
                                                        hibernateType.getName(), 
                                                        capitalizeFirstLetter(splitCamelCase(a.getName()))
                                                        );
            hibernateParamList.add(param);
            logger.debug(param.toString());
        });

    } catch (ClassNotFoundException e) {
        logger.error(String.format("error occured generating the params %s" , e));
    }
}

и два вспомогательных метода String для создания ярких меток, которые могут не имеет значения для этого поста

private String splitCamelCase(String s) {
   return s.replaceAll(
      String.format("%s|%s|%s",
         "(?<=[A-Z])(?=[A-Z][a-z])",
         "(?<=[^A-Z])(?=[A-Z])",
         "(?<=[A-Za-z])(?=[^A-Za-z])"
      ),
      " "
   );
}

private String capitalizeFirstLetter(String s) {
    return Character.toUpperCase(s.charAt(0)) + s.substring(1);
}

И, конечно, в моем WebAppConfig.class я получаю фабрику сеансов

public SessionFactory sessionFactory() {
  LocalSessionFactoryBuilder builder =
            new LocalSessionFactoryBuilder(dataSource());
  builder.addProperties(hibernateProperties());
  builder.scanPackages(new String[] { "com....model" });
  SessionFactory sessionFactory = builder.buildSessionFactory();

  return sessionFactory;

}

Возможно, мы можем оптимизировать потоки немного больше, но для меня это было довольно быстро и легко.

1
ответ дан Shilan 26 August 2018 в 16:59
поделиться

Немного странно, но он работает:

ClassMetadata hibernateMetadata = sessionFactory.getClassMetadata(pClassName);

if (hibernateMetadata == null)
{
    return;
}

if (hibernateMetadata instanceof AbstractEntityPersister)
{
     AbstractEntityPersister persister = (AbstractEntityPersister) hibernateMetadata;
     String tableName = persister.getTableName();
     String[] columnNames = persister.getKeyColumnNames();
}
32
ответ дан tom redfern 26 August 2018 в 16:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: