Crear una fábrica de sesiones en Hibernate 4

Tengo problemas para generar una fábrica de sesiones en Hibernate 4. En Hibernate 3 hice lo siguiente:

org.hibernate.cfg.Configuration conf= HibernateUtil .getLimsInitializedConfiguration(systemConfiguration .getHibernateconfFile()); SessionFactory sf = conf.configure().buildSessionFactory(); 

Ahora necesito pasar una clase de ServiceRegistry a buildSessionFactory, pero los Javadocs son extremadamente imprecisos sobre cómo hacerlo. ¿Algun consejo?

Sí, han dejado de usar la API buildSessionFactory anterior, y es bastante fácil hacerlo bien … puedes hacer algo como esto …

EDITAR : ServiceRegistryBuilder está en desuso. debes usar StandardServiceRegistryBuilder

 public void testConnection() throws Exception { logger.info("Trying to create a test connection with the database."); Configuration configuration = new Configuration(); configuration.configure("hibernate_sp.cfg.xml"); StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()); SessionFactory sessionFactory = configuration.buildSessionFactory(ssrb.build()); Session session = sessionFactory.openSession(); logger.info("Test connection with the database created successfuly."); } 

Para obtener más información de referencia y detalles, puede consultar el caso de prueba oficial de hibernate en https://github.com/hibernate/hibernate-orm/blob/master/hibernate-testing/src/main/java/org/hibernate/testing /junit4/BaseCoreFunctionalTestCase.java function (buildSessionFactory ()).

¡Prueba esto!

 package your.package; import org.hibernate.HibernateException; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; public class HibernateUtil { private static SessionFactory sessionFactory; private static ServiceRegistry serviceRegistry; static { try { // Configuration configuration = new Configuration(); Configuration configuration = new Configuration().configure(); serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); } catch (HibernateException he) { System.err.println("Error creating Session: " + he); throw new ExceptionInInitializerError(he); } } public static SessionFactory getSessionFactory() { return sessionFactory; } } 
 Configuration hibConfiguration = new Configuration() .addResource("wp4core/hibernate/config/table.hbm.xml") .configure(); serviceRegistry = new ServiceRegistryBuilder() .applySettings(hibConfiguration.getProperties()) .buildServiceRegistry(); sessionFactory = hibConfiguration.buildSessionFactory(serviceRegistry); session = sessionFactory.withOptions().openSession(); 

Lo siguiente expresa la experiencia que tuve con hibernate 4.0.0.Final.

El javadoc (distribuido bajo la licencia LGPL) de la clase org.hibernate.cfg.Configuration establece que:

NOTA: Esto será reemplazado por el uso de ServiceRegistryBuilder y org.hibernate.metamodel.MetadataSources en su lugar después de la versión 4.0, punto en el que esta clase quedará obsoleta y se eliminará en 5.0. Ver HHH-6183 , HHH-2578 y HHH-6586 para más detalles

Después de mirar el problema 2578, utilicé algo como esto:

 ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().configure().buildServiceRegistry(); MetadataSources metadataSources = new MetadataSources(serviceRegistry); metadataSources.addResource("some_mapping.hbm.xml") SessionFactory sessionFactory = metadataSources.buildMetadata().buildSessionFactory(); 

Para que empiece a leer la configuración, tuve que modificar la configuración de mi hibernación 3.2.6 y los archivos de mapeo para usar xmlns="http://www.hibernate.org/xsd/hibernate-configuration" y xmlns="http://www.hibernate.org/xsd/hibernate-mapping" y también eliminar las especificaciones dtd.

No pude encontrar una forma de que inspeccione las asignaciones definidas en hibernate.cfg.xml e hibernate. el prefijo de las propiedades relacionadas con la hibernación en hibernate.cfg.xml ya no es opcional.

Esto podría funcionar para algunos.

Yo, por ejemplo, encontré un error porque los archivos de mapeo contenían y terminaron usando la forma de configuración en desuso:

 Configuration configuration = new Configuration().configure(); SessionFactoryImpl sessionFactory = (SessionFactoryImpl) configuration.buildSessionFactory(); EventListenerRegistry listenerRegistry = sessionFactory.getServiceRegistry().getService(EventListenerRegistry.class); SolrIndexEventListener indexListener = new SolrIndexEventListener(); // a SaveOrUpdateEventListener i wanted to attach listenerRegistry.appendListeners(EventType.SAVE_UPDATE, indexListener); 

Tuve que anexar programáticamente detectores de eventos porque Configuration ya no los busca en hibernate.cfg.xml

Incluso hay una actualización en 4.3.0 API. ServiceRegistryBuilder también está en desuso en 4.3.0 y reemplazado por el StandardServiceRegistryBuilder. Ahora el código real para crear la fábrica de sesiones miraría este ejemplo al crear la fábrica de sesiones .

[cita de http://www.javabeat.net/session-factory-hibernate-4/%5D

Hay muchas API desaprobadas en el marco central de hibernación. Uno de los puntos frustrantes en este momento es que la documentación oficial de hibernación no proporciona las instrucciones claras sobre cómo usar la nueva API y las estadísticas de que la documentación está completa. Además, cada versión incremental obtiene cambios en algunas de las API importantes. Una de ellas es la nueva API para crear la fábrica de sesiones en Hibernate 4.3.0 en salas. En nuestras versiones anteriores, hemos creado la fábrica de sesiones de la siguiente manera:

 SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 

El método buildSessionFactory está en desuso de la versión hibernate 4 y se reemplaza por la nueva API. Si está utilizando hibernate 4.3.0 y superior, su código debe ser:

 Configuration configuration = new Configuration().configure(); StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()); SessionFactory factory = configuration.buildSessionFactory(builder.build()); 

Class ServiceRegistryBuilder se reemplaza por StandardServiceRegistryBuilder de 4.3.0. Parece que habrá muchos cambios en la versión 5.0. Todavía no hay mucha claridad sobre las API desaprobadas y las alternativas adecuadas para su uso. Cada versión incremental genera API más obsoleta, están en camino de ajustar el marco principal para la versión 5.0.

En versiones anteriores, la fábrica de sesiones se creó de la siguiente manera:

 SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 

El método buildSessionFactory está en desuso de la versión hibernate 4 y se reemplaza por la nueva API. Si está utilizando hibernate 4.3.0 y superior, su código tiene que ser como:

 Configuration configuration = new Configuration().configure(); StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(). applySettings(configuration.getProperties()); SessionFactory factory = configuration.buildSessionFactory(builder.build()); 

El método buildSessionFactory está en desuso de la versión Hibernate 4 y se reemplaza con la nueva API. Si está utilizando Hibernate 4.3.0 y superior, su código debe ser:

 Configuration configuration = new Configuration().configure(); StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder() .applySettings(configuration.getProperties()); SessionFactory factory = configuration.buildSessionFactory(builder.build());