¿El método de configuración buildSessionFactory () está en desuso en Hibernate


215

Cuando actualicé la versión de Hibernate de 3.6.8 a 4.0.0, 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 usar otro método

buildSessionFactory(ServiceRegistry serviceRegistry)

pero en la documentación encontré una variante obsoleta :(

¿Me pueden ayudar con este pequeño malentendido?


Incluso en la guía de inicio rápido 4.3.8 están utilizando este ejemplo: nueva Configuración () .configure (). BuildSessionFactory (); :(
Venkata Raju

@VenkataRaju Puede ser, no está mal, porque en Hibernate 5 todo cambia y este ejemplo es correcto, pero (!) Todos los ejemplos de configuración aquí no son válidos para Hibernate 5 .
v.ladynev

Respuestas:


374

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

66
¡org.hibernate.service.ServiceRegistryBuilder también está depravado!
Accollativo

11
Sí, parece que ServiceRegistryBuilder en sí mismo está en desuso, mirando la documentación, sugieren usar StandardServiceRegistryBuilder en su lugar. Así que supongo que la llamada ahora debería ser nueva StandardRegistryBuilder (). ApplySettings (configuration.getProperties ()). Build ();
Simon B

No puedo encontrar StandardRegistryBuilder en hibernate 4.3 ¿podría ser que se cambió allí?
Dejell

77
En lugar de build () uno necesita buildServiceRegistry (), ¿verdad? No puedo encontrar ServiceRegistry.build ().
Herbert

43
Parece que es la misión del equipo de hibernación desaprobar todo lo que crean.
3urdoch

16

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

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:


Entonces, ¿cómo hacemos sesiones ahora? ¿Cuál es el objeto asignado a la interfaz serviceRegistry?
Ismail Marmoush

@IsmailMarmoush: todavía no he jugado demasiado con esto, pero he agregado algunas referencias adicionales.
ziesemer

7

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

    }
}

Algunos métodos obsoletos se están utilizando en este código.
Kevin Bowersox

6

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 proporcionar su propia ruta allí. Esto es similar a (pero los errores tipográficos corregidos) 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);

4

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


4

Una mejor manera de crear un objeto SessionFactory en la última versión de hibernate 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());

obteniendo error: El método buildSessionFactory () en el tipo Configuración no es aplicable para los argumentos (StandardServiceRegistry)
Anju

4

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 que no sea javadoc lo contradice, lo más probable es 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" del javadoc está en el mismo archivo que el código.

En el caso de las @deprecatedetiquetas, es una certeza virtual de que el javadoc es más preciso. Los desarrolladores desprecian las cosas después de una cuidadosa consideración ... y (en términos generales) no las desprecian.


1
... y no los desprecian. ... a menos que se llame System.getenv(String) bugs.sun.com/bugdatabase/view_bug.do?bug_id=4199068
bestsss

1
No es inusual encontrar proyectos basura, cuyos desarrolladores perezosos no se molestan en mantener la documentación alineada con el código, de modo que vuelvan locos a sus usuarios, mientras intentan descubrir cómo funciona la basura sangrienta revolviendo en sí misma y esperando allí es algo más que / ** TODO: comment-me * /: - \
zakmck

@bestsss ... o se llama Configuration.buildSessionFactory();)
v.ladynev

3

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

2

TL; DR

Sí lo es. Hay mejores formas de arrancar Hibernate, como las siguientes.

Bootstrap nativo de Hibernate

El Configurationobjeto heredado es menos poderoso que usar el BootstrapServiceRegistryBuilder, introducido desde Hibernate 4:

final BootstrapServiceRegistryBuilder bsrb = new BootstrapServiceRegistryBuilder()
    .enableAutoClose();

Integrator integrator = integrator();
if (integrator != null) {
    bsrb.applyIntegrator( integrator );
}

final BootstrapServiceRegistry bsr = bsrb.build();

final StandardServiceRegistry serviceRegistry = 
    new StandardServiceRegistryBuilder(bsr)
        .applySettings(properties())
        .build();

final MetadataSources metadataSources = new MetadataSources(serviceRegistry);

for (Class annotatedClass : entities()) {
    metadataSources.addAnnotatedClass(annotatedClass);
}

String[] packages = packages();
if (packages != null) {
    for (String annotatedPackage : packages) {
        metadataSources.addPackage(annotatedPackage);
    }
}

String[] resources = resources();
if (resources != null) {
    for (String resource : resources) {
        metadataSources.addResource(resource);
    }
}

final MetadataBuilder metadataBuilder = metadataSources.getMetadataBuilder()
    .enableNewIdentifierGeneratorSupport(true)
    .applyImplicitNamingStrategy(ImplicitNamingStrategyLegacyJpaImpl.INSTANCE);

final List<Type> additionalTypes = additionalTypes();
if (additionalTypes != null) {
    additionalTypes.stream().forEach(type -> {
        metadataBuilder.applyTypes((typeContributions, sr) -> {
            if(type instanceof BasicType) {
                typeContributions.contributeType((BasicType) type);
            } else if (type instanceof UserType ){
                typeContributions.contributeType((UserType) type);
            } else if (type instanceof CompositeUserType) {
                typeContributions.contributeType((CompositeUserType) type);
            }
        });
    });
}

additionalMetadata(metadataBuilder);

MetadataImplementor metadata = (MetadataImplementor) metadataBuilder.build();

final SessionFactoryBuilder sfb = metadata.getSessionFactoryBuilder();
Interceptor interceptor = interceptor();
if(interceptor != null) {
    sfb.applyInterceptor(interceptor);
}

SessionFactory sessionFactory = sfb.build();

Bootstrap JPA

También puede iniciar Hibernate con JPA:

PersistenceUnitInfo persistenceUnitInfo = persistenceUnitInfo(getClass().getSimpleName());
Map configuration = properties();

Interceptor interceptor = interceptor();
if (interceptor != null) {
    configuration.put(AvailableSettings.INTERCEPTOR, interceptor);
}

Integrator integrator = integrator();
if (integrator != null) {
    configuration.put(
        "hibernate.integrator_provider", 
        (IntegratorProvider) () -> Collections.singletonList(integrator));
}

EntityManagerFactoryBuilderImpl entityManagerFactoryBuilder = 
    new EntityManagerFactoryBuilderImpl(
        new PersistenceUnitInfoDescriptor(persistenceUnitInfo), 
        configuration
);
EntityManagerFactory entityManagerFactory = entityManagerFactoryBuilder.build();

De esta manera, estás construyendo el en EntityManagerFactorylugar de a SessionFactory. Sin embargo, también se SessionFactoryextiende EntityManagerFactory, so the actual object that's built is aSessionFactoryImpl`.

Conclusión

Estos dos métodos de arranque afectan el comportamiento de Hibernate. Cuando se usa el bootstrap nativo, Hibernate se comporta en el modo heredado, que es anterior a JPA.

Al iniciar usando JPA, Hibernate se comportará de acuerdo con la especificación JPA.

Existen varias diferencias entre estos dos modos:

Para obtener más detalles sobre estas diferencias, consulte la JpaComplianceclase.


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

'StandardServiceRegistryBuilder' también está en desuso.
NixRam

@NitinRam StandardServiceRegistryBuilderNO está en desuso.
JPG

Bastante extraño cómo se toman y quitan cosas las cosas en Hibernate. Solía ​​ser en un punto. stackoverflow.com/questions/17911308/…
NixRam

0

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

0

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

0

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

    }
}

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

    }

}

0

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 de la versión 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 la configuración = nueva Configuración (). Configure ();

  2. StandardServiceRegistryBuilder Builder = nuevo 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. Todavía no hay mucha claridad sobre las API obsoletas y las alternativas adecuadas para usar. Cada versión incremental viene con una API más obsoleta, están en camino de ajustar el marco central para la versión 5.0.


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

0

Si hay alguien aquí después de actualizar a 5.1, así es como funciona

StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
                MetadataSources sources = new MetadataSources(registry);
                Metadata metadata = sources.getMetadataBuilder().build();
                sessionFactory = metadata.getSessionFactoryBuilder().build();

en lugar de lo siguiente en hibernate 4.3

 ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(
            configuration.getProperties()). buildServiceRegistry();
    sessionFactory = configuration.buildSessionFactory(serviceRegistry);

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.