Hibernate Migration от 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?
Пожалуйста, помогите в этой проблеме миграции.
Ответы
Ответ 1
I опубликовано в 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
Ответ 2
Получить объект PersisterCreationContext, а затем попробовать следующее: -
PersistentClass persistentClass =
persisterCreationContext.getMetadata().getEntityBinding(className);
Проверьте эту ссылку (Пример 3.8. Родительский загрузочный старт - соединяя все вместе), чтобы понять, как получить standardRegistry, metadata и sessionFactory в Hibernate 5.x
Теперь, когда мы вытаскивали метаданные из persisterCreationContext, и теперь у нас уже есть это, поэтому мы можем сразу получить требуемый объект PersistentClass любого объекта с помощью
SessionFactory sessionFactory = metadata.getSessionFactoryBuilder().build();
PersistentClass persistentClass = metadata.getEntityBinding(className);
Ответ 3
Это обсуждается в Hibernate 5.0 Migration Guide, а также Раздел Bootstrap в Руководстве пользователя Hibernate (см., В частности, "Наследие загрузки" ).
Короче говоря, хотя конфигурация по-прежнему поддерживается для прямой загрузки, если вы хотите "подключиться" к процессу начальной загрузки, вам придется использовать новые API-интерфейсы для начальной загрузки.
Ответ 4
В 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 initialize Метаданные, подобные этому
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
}