¿BuildSessionFactory () está en desuso en hibernate 4?

Cuando actualicé la versión de Hibernate de 3.6.8.final a 4.0.0.final recibí una advertencia sobre el método en desuso buildSessionFactory() en esta línea:

 private static final SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 

el javadoc recomienda el uso de otro método

buildSessionFactory(ServiceRegistry serviceRegistry)

pero en la documentación encontré la variante obsoleta 🙁

¿Puedes ayudarme con este pequeño malentendido?

Sí, está en desuso. Reemplace su SessionFactory con lo siguiente:

En Hibernate 4.0, 4.1, 4.2

 private static SessionFactory sessionFactory; private static ServiceRegistry serviceRegistry; public static SessionFactory createSessionFactory() { Configuration configuration = new Configuration(); configuration.configure(); ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings( configuration.getProperties()). buildServiceRegistry(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); return sessionFactory; } 

ACTUALIZAR:

En Hibernate 4.3 ServiceRegistryBuilder está en desuso . Use lo siguiente en su lugar.

 serviceRegistry = new StandardServiceRegistryBuilder().applySettings( configuration.getProperties()).build(); 

Sí, está en desuso. http://docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/cfg/Configuration.html#buildSessionFactory () específicamente le dice que use el otro método que encontró en su lugar ( buildSessionFactory(ServiceRegistry serviceRegistry) ) – así que úsalo.

La documentación se copia de una versión a otra, y probablemente aún no se haya actualizado (no reescriben el manual con cada versión), así que confíe en los Javadocs.

Los detalles de este cambio se pueden ver en:

Algunas referencias adicionales:

o

 public class Hbutil { private static SessionFactory sessionFactory; private static ServiceRegistry serviceRegistry; private static SessionFactory configureSessionFactory() throws HibernateException { Configuration configuration = new Configuration(); configuration.configure(); serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); return sessionFactory; } public static SessionFactory getSessionFactory() { return configureSessionFactory(); } } 

Es tan simple como esto: los documentos de JBoss no están 100% perfectamente bien mantenidos. Vaya con lo que dice buildSessionFactory(ServiceRegistry serviceRegistry) : buildSessionFactory(ServiceRegistry serviceRegistry) .

Código verificado para trabajar en Hibernate 4.3.0. Tenga en cuenta que puede eliminar el parámetro de nombre de archivo XML, o bien proporcionar su propia ruta allí. Esto es similar (pero corregido con errores tipográficos) a otras publicaciones aquí, pero esta es correcta.

 import org.hibernate.SessionFactory; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; Configuration configuration = new Configuration(); configuration.configure("/com/rtw/test/hiber/hibernate.cfg.xml"); ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); 

No es inusual encontrar discrepancias entre las diferentes versiones de la documentación. La mayoría de los desarrolladores ven la documentación como una tarea rutinaria, y tienden a posponerla.

Como regla general, si el javadoc dice una cosa y alguna documentación no javadoc lo contradice, las posibilidades son que el javadoc sea más preciso. Los progtwigdores tienen más probabilidades de mantener el javadoc actualizado con los cambios en el código … porque la “fuente” para el javadoc está en el mismo archivo que el código.

En el caso de @deprecated tags @deprecated , es una certeza virtual que el javadoc es más preciso. Los desarrolladores desprecian las cosas después de una cuidadosa consideración … y (en general) no las descifran.

Una forma mejor de crear objetos SessionFactory en Latest hibernate versión 4.3.0 en adelante es la siguiente:

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

Si está utilizando Hibernate 5.2 y superior, puede usar esto:

  private static StandardServiceRegistry registry; private static SessionFactory sessionFactory; public static SessionFactory getSessionFactory() { if (sessionFactory == null) { try { // Creating a registry registry = new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build(); // Create the MetadataSources MetadataSources sources = new MetadataSources(registry); // Create the Metadata Metadata metadata = sources.getMetadataBuilder().build(); // Create SessionFactory sessionFactory = metadata.getSessionFactoryBuilder().build(); } catch (Exception e) { e.printStackTrace(); if (registry != null) { StandardServiceRegistryBuilder.destroy(registry); } } } return sessionFactory; } //To shut down public static void shutdown() { if (registry != null) { StandardServiceRegistryBuilder.destroy(registry); } } 
 public class HibernateSessionFactory { private static final SessionFactory sessionFactory = buildSessionFactory1(); private static SessionFactory buildSessionFactory1() { Configuration configuration = new Configuration().configure(); // configuration // settings // from // hibernate.cfg.xml StandardServiceRegistryBuilder serviceRegistryBuilder = new StandardServiceRegistryBuilder(); serviceRegistryBuilder.applySettings(configuration.getProperties()); ServiceRegistry serviceRegistry = serviceRegistryBuilder.build(); return configuration.buildSessionFactory(serviceRegistry); } public static SessionFactory getSessionFactory() { return sessionFactory; } public static void shutdown() { // Close caches and connection pools getSessionFactory().close(); } 

public void sampleConnection () lanza Excepción {

  Configuration cfg = new Configuration().addResource("hibernate.cfg.xml").configure(); StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()); SessionFactory sessionFactory = configuration.buildSessionFactory(ssrb.build()); Session session = sessionFactory.openSession(); logger.debug(" connection with the database created successfuly."); } 

Edité el método creado por batbaatar arriba para que acepte el objeto Configuración como un parámetro:

  public static SessionFactory createSessionFactory(Configuration configuration) { serviceRegistry = new StandardServiceRegistryBuilder().applySettings( configuration.getProperties()).build(); factory = configuration.buildSessionFactory(serviceRegistry); return factory; } 

En la clase principal que hice:

  private static SessionFactory factory; private static Configuration configuration ... configuration = new Configuration(); configuration.configure().addAnnotatedClass(Employee.class); // Other configurations, then factory = createSessionFactory(configuration); 

En Hibernate 4.2.2

 import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; public class Test { public static void main(String[] args) throws Exception { Configuration configuration = new Configuration() .configure(); ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings( configuration.getProperties()).buildServiceRegistry(); SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry); Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); Users users = new Users(); ... ... session.save(users); transaction.commit(); session.close(); sessionFactory.close(); } } 
 Tested on 4.2.7 release package com.national.software.hibernate; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; import com.national.software.dto.UserDetails; public class HibernateTest { static SessionFactory sessionFactory; public static void main(String[] args) { // TODO Auto-generated method stub UserDetails user = new UserDetails(); user.setUserId(1); user.setUserName("user1"); Configuration config = new Configuration(); config.configure(); ServiceRegistry serviceRegistry = (ServiceRegistry) new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry(); sessionFactory = config.buildSessionFactory(serviceRegistry); Session session = sessionFactory.openSession(); session.beginTransaction(); session.save(user); session.getTransaction().commit(); } } 

aquí hay muchas API desaprobadas en el marco central de hibernación.

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:

  1. Configuración de configuración = nueva Configuración (). Configure ();

  2. StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder (). ApplySettings (configuration.getProperties ());

  3. Factory de SessionFactory = 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 hibernate 5.3.1 , puedes probar esto:

 ServiceRegistry standardRegistry = new StandardServiceRegistryBuilder().configure().build(); Metadata sources = new MetadataSources(standardRegistry).addAnnotatedClass(MyEntity.class).getMetadataBuilder().build(); SessionFactory sf = sources.buildSessionFactory(); 

Solo importa el siguiente paquete

 import org.hibernate.cfg.Configuration;