Hibernate Миграция с 4.3.x на 5.x для метода org.hibernate.cfg.Configuration.getClassMapping(className)

В Hibernate 4.3.x есть метод getClassMapping(className) класса org.hibernate.cfg.Configuration. Но в Hibernate 5.x этот метод getClassMapping(className) удален из класса Configuration.

Какая будет подмена кода в Hibernate-5?

Пожалуйста, помогите с этой проблемой миграции.


person Nirav Patel    schedule 25.09.2015    source источник
comment
Вам это нужно во время начальной загрузки или во время выполнения?   -  person flo    schedule 13.10.2015
comment
Нет, я реализовал собственный механизм кэширования. Поэтому мне это нужно после начальной загрузки при запуске запросов. Ссылка http://docs.jboss.org/hibernate/orm/5.0/userGuide/en-US/html_single/#bootstrap полезен, если мне нужно получить или создать метаданные или sessionFactory. Но шаги после начальной загрузки в документации не указаны.   -  person Nirav Patel    schedule 15.10.2015
comment
ClassMetadata недостаточно? Вы можете получить его от SessionFactory через ClassMetadata getClassMetadata(String entityName).   -  person flo    schedule 15.10.2015
comment
Нет ClassMetadata недостаточно. Нужно PersistentClass из метаданных.   -  person Nirav Patel    schedule 16.10.2015


Ответы (4)


Я опубликовал в Broadleaf Commerce, потому что им также нужно было PersistentClass:

Я работал с Hibernate 5, и некоторые из этих изменений .... Чтобы получить метаданные, теперь используйте Serviceloader:

package org.broadleafcommerce.openadmin.server.dao;

import org.hibernate.boot.SessionFactoryBuilder;
import org.hibernate.boot.spi.MetadataImplementor;
import org.hibernate.boot.spi.SessionFactoryBuilderFactory;
import org.hibernate.boot.spi.SessionFactoryBuilderImplementor;

public class EntityMetaData implements SessionFactoryBuilderFactory {

    private static final ThreadLocal<MetadataImplementor> meta = new ThreadLocal<>();

    @Override
    public SessionFactoryBuilder getSessionFactoryBuilder(MetadataImplementor metadata, SessionFactoryBuilderImplementor defaultBuilder) {
        meta.set(metadata);
        return defaultBuilder;
    }

    public static MetadataImplementor getMeta() {
        return meta.get();
    }
}

Вам понадобится файл:

/resources/META-INF/services/org.hibernate.boot.spi.SessionFactoryBuilderFactory

с полным именем класса, которое в моем примере:

org.broadleafcommerce.openadmin.server.dao.EntityMetaData
person John    schedule 17.10.2015
comment
Спасибо, вышеуказанное решение сработало. Я сделал только одно изменение в классе EntityMetaData, то есть вместо использования ThreadLocal я использовал HashMap для хранения объекта метаданных. - person Nirav Patel; 20.10.2015
comment
Как выполняется метод getSessiongFactoryBuilder? Так что я могу вызвать getMeta() для получения MetadataImplementor. Можно ли каким-то образом внедрить EntityMetaData в Hibernate? Извините не понял... - person Vering; 26.04.2017
comment
@NiravPatel@John Не могли бы вы поделиться полным решением этой проблемы, поскольку я не могу его реализовать. - person rxt66; 10.12.2020

Получите объект PersisterCreationContext, а затем попробуйте следующее:

PersistentClass persistentClass = 
persisterCreationContext.getMetadata().getEntityBinding(className);

Пожалуйста, проверьте эту ссылку (Пример 3.8. Встроенная начальная загрузка — собираем все вместе), чтобы понять, как получить стандартный реестр, метаданные и sessionFactory в Hibernate 5.x

Теперь, когда мы извлекали метаданные из persisterCreationContext и теперь они у нас уже есть, мы можем сразу же получить требуемый объект PersistentClass любой сущности с помощью

SessionFactory sessionFactory = metadata.getSessionFactoryBuilder().build();
PersistentClass persistentClass = metadata.getEntityBinding(className);
person Avis    schedule 13.10.2015
comment
Как получить persisterCreationContext? Не могли бы вы обновить ответ с правильными шагами. то есть обычно у нас будет объект sessionFactory или объект конфигурации, так как же мы можем получить из него PersisterCreationContext? - person Nirav Patel; 13.10.2015
comment
Мне нужно обратное тому, что предлагается в ссылке. Есть ли способ получить метаданные из объекта org.springframework.orm.hibernate5.LocalSessionFactoryBean или org.hibernate.SessionFactory? - person Nirav Patel; 14.10.2015
comment
Как и в hibernate-4.x, метод getClassMapping(className) находится в классе Configuration. Итак, у меня есть только объект конфигурации. Поскольку теперь в hibernte-5.x этот метод удален из класса, мне нужно получить метаданные или persisterCreationContext из объекта конфигурации. - person Nirav Patel; 15.10.2015
comment
Я мог бы подумать об одном решении, если вы напишите ASPECT вокруг конструктора класса org.hibernate.internal.SessionFactoryImpl. Поэтому, как только он вызывается во время загрузки системы, вы можете получить дескриптор метаданных для своей задачи. Конструктор: - public SessionFactoryImpl (окончательные метаданные MetadataImplementor, параметры SessionFactoryOptions) {} - person Avis; 15.10.2015
comment
Можно ли получить параметр конструктора и сохранить его в bean-компоненте пользовательского класса с помощью аспектно-ориентированного программирования? - person Nirav Patel; 16.10.2015

В Hibernate 3 и 4 вы бы сделали что-то вроде этого

URL configFileURL = getResource(); //some method to get hold of the location of your hibernate.cfg.xml
Configuration configuration = (new Configuration()).configure(configFileURL);
Iterator classMappings = configuration.getClassMappings();
  while (classMappings.hasNext()) {
    PersistentClass persistentClass = (PersistentClass) classMappings.next();
    //do somthing 
    }

В Hibernate 5 инициализируйте метаданные следующим образом

URL configFileURL = getResource(); //some method to get hold of the location of your hibernate.cfg.xml
StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder().configure(configFileURL).build();
Metadata metaData = new MetadataSources(standardRegistry).getMetadataBuilder().build();

И используйте getEntityBindings() для метаданных.

Collection<PersistentClass> entityBindings = metadata.getEntityBindings();
Iterator<PersistentClass> iterator = entityBindings.iterator();
  while (iterator.hasNext()) {
    PersistentClass persistentClass = iterator.next();    
    //do somthing
  }
person Vering    schedule 27.04.2017

Это также обсуждается в Руководстве по переходу на Hibernate 5.0. как в главе Bootstrap в Руководстве пользователя Hibernate (см., в частности, "Старая начальная загрузка " приложение).

Короче говоря, хотя конфигурация по-прежнему поддерживается для прямой загрузки, если вы хотите «подключиться» к процессу начальной загрузки, вам придется использовать новые API-интерфейсы начальной загрузки.

person Steve Ebersole    schedule 13.11.2015
comment
Ссылки на начальную загрузку не работают, а ссылка на руководство по миграции в настоящее время указывает на пустой документ по миграции 5.4. - person Greg Brown; 22.08.2018