java - name - hibernate.dialect sql server
Migración de Hibernate de 4.3.x a 5.x para el método org.hibernate.cfg.Configuration.getClassMapping(className) (4)
En Hibernate 4.3.x, hay un método getClassMapping(className)
de la clase org.hibernate.cfg.Configuration
. Pero en Hibernate 5.x, este getClassMapping(className)
se elimina de la clase de Configuration
.
¿Cuál será la sustitución del código en Hibernate-5?
Por favor, ayuda con este problema de migración.
En Hibernate 3 y 4 harías algo como esto
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
}
En Hibernate 5 inicializa metadatos como este
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();
Y use getEntityBindings () en los metadatos
Collection<PersistentClass> entityBindings = metadata.getEntityBindings();
Iterator<PersistentClass> iterator = entityBindings.iterator();
while (iterator.hasNext()) {
PersistentClass persistentClass = iterator.next();
//do somthing
}
Esto se explica en la Guía de migración de Hibernate 5.0 y en el http://docs.jboss.org/hibernate/orm/5.0/userGuide/en-US/html_single/#bootstrap (consulte especialmente el apéndice "Legacy Bootstrapping" ).
En resumen, aunque la configuración aún se admite para el arranque en línea recta, si desea "enganchar" el proceso de arranque, tendrá que usar las nuevas API de arranque.
Obtenga un objeto de PersisterCreationContext y luego intente esto: -
PersistentClass persistentClass =
persisterCreationContext.getMetadata().getEntityBinding(className);
Por favor revise este link ( Ejemplo 3.8. Bootstrapping nativo - Poniéndolo todo junto ) para entender cómo obtener un registro estándar, metadatos y sessionFactory en Hibernate 5.x
Ahora que estábamos extrayendo metadatos de persisterCreationContext y ahora ya lo teníamos para poder obtener de inmediato el objeto PersistentClass requerido de cualquier entidad por
SessionFactory sessionFactory = metadata.getSessionFactoryBuilder().build();
PersistentClass persistentClass = metadata.getEntityBinding(className);
Publiqué en Broadleaf Commerce porque también necesitaban PersistentClass
:
He estado trabajando con Hibernate 5 y algunos de estos cambios ... Para obtener metadatos, ahora use 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();
}
}
Necesitarás el archivo:
/resources/META-INF/services/org.hibernate.boot.spi.SessionFactoryBuilderFactory
con el nombre completo de la clase, que en mi ejemplo es:
org.broadleafcommerce.openadmin.server.dao.EntityMetaData