tutorial example java hibernate

java - example - hibernate spring



¿BuildSessionFactory() está en desuso en hibernación 4? (16)

Cuando actualicé la versión de Hibernate de 3.6.8.final a 4.0.0.final, recibí una advertencia sobre el método obsoleto 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 documentation encontré una variante obsoleta :(

¿Puedes ayudarme con este pequeño malentendido?


A continuación se presenta una mejor manera de crear un objeto SessionFactory en la última versión 4.3.0 de hibernate:

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


Aquí hay muchas API en desuso en el marco central de hibernación.

Hemos creado la fábrica de sesiones de la siguiente manera:

SessionFactory sessionFactory = nueva configuración (). Configure (). BuildSessionFactory ();

El método buildSessionFactory está en desuso desde el lanzamiento de hibernate 4 y se reemplaza con la nueva API. Si está utilizando la hibernación 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. SessionFactory factory = configuration.buildSessionFactory (builder.build ());

La clase ServiceRegistryBuilder se reemplaza por StandardServiceRegistryBuilder de 4.3.0. Parece que habrá muchos cambios en la versión 5.0. Aún no hay mucha claridad sobre las API en desuso y las alternativas adecuadas para usar. Cada lanzamiento incremental viene con una API más obsoleta, están en forma de ajustar el marco central para el lanzamiento 5.0.


Código verificado para trabajar en Hibernate 4.3.0. Observe que puede eliminar el parámetro de nombre de archivo XML, o bien proporcionar su propia ruta allí. Esto es similar a (pero los errores tipográficos corregidos) otros mensajes aquí, pero este es correcto.

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);


Edité el método creado por batbaatar arriba para que acepte el objeto de 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 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 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();


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(); } }


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


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

Como regla general, si el javadoc dice una cosa y alguna documentación que no es de javadoc lo contradice, es probable que el javadoc sea más preciso. Es más probable que los programadores mantengan 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 etiquetas @deprecated , es una certeza virtual de que el javadoc es más preciso. Los desarrolladores desaprueban las cosas después de una cuidadosa consideración ... y (en general) no los descartan.


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 es probable que simplemente no se haya actualizado todavía (no reescriben el manual con cada versión); confíe en los Javadocs.

Los detalles de este cambio se pueden ver en:

Algunas referencias adicionales:


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();


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); } }


Solo importa el siguiente paquete,

import org.hibernate.cfg.Configuration;


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(); } }


public void sampleConnection () lanza Exception {

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."); }


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(); } }


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(); }