web-dev-qa-db-fra.com

BuildSessionFactory () est-il obsolète en veille prolongée 4?

Lorsque j'ai mis à jour la version d'Hibernate de 3.6.8.final à 4.0.0.final, un avertissement concernant la méthode obsolète buildSessionFactory() s'affiche dans cette ligne:

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

le javadoc recommande l'utilisation d'une autre méthode

buildSessionFactory(ServiceRegistry serviceRegistry)

mais dans le documentation j'ai trouvé la variante déconseillée :(

Pouvez-vous m'aider avec ce petit malentendu?

212
pushistic

Oui, c'est obsolète. Remplacez votre SessionFactory par ce qui suit:

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

PDATE:

Dans Hibernate 4., ServiceRegistryBuilder est obsolète. Utilisez ce qui suit à la place.

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

Oui, c'est déconseillé. http://docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/cfg/Configuration.html#buildSessionFactory () vous indique spécifiquement d'utiliser l'autre méthode que vous avez trouvée à la place ( buildSessionFactory(ServiceRegistry serviceRegistry)) - utilisez-le donc.

La documentation est copiée d'une édition à l'autre et n'a probablement pas encore été mise à jour (le manuel ne sera pas réécrit à chaque édition) - alors faites confiance aux Javadocs.

Les détails de ce changement peuvent être consultés à:

Quelques références supplémentaires:

16
ziesemer

ou

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

    }
}
7
mixturez

Code vérifié pour fonctionner dans Hibernate 4.3.0. Notez que vous pouvez supprimer le paramètre de nom de fichier XML ou indiquer votre propre chemin. Ceci est similaire à (mais des fautes de frappe corrigées) d’autres articles ici, mais celui-ci est correct.

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

C'est aussi simple que cela: les documents JBoss ne sont pas parfaitement entretenus à 100%. Allez avec ce que dit le JavaDoc : buildSessionFactory(ServiceRegistry serviceRegistry).

4
Matt Ball

Il n’est pas rare de trouver des différences entre les différentes versions de la documentation. La plupart des développeurs considèrent la documentation comme une corvée et ils ont tendance à la remettre à plus tard.

En règle générale, si le javadoc dit une chose et que la documentation non-javadoc la contredit, il y a de fortes chances que le javadoc soit plus précis. Les programmeurs sont plus susceptibles de maintenir le javadoc à jour avec les modifications apportées au code ... car la "source" du javadoc se trouve dans le même fichier que le code.

Dans le cas des balises @deprecated, il est pratiquement certain que le javadoc est plus précis. Les développeurs déprécient certaines choses après un examen approfondi ... et (en général), ils ne les surdonnent pas.

4
Stephen C

Si vous utilisez Hibernate 5.2 et supérieur, vous pouvez utiliser ceci:

  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);
    }
  }
3
Hasan K

Une meilleure façon de créer SessionFactory object dans la dernière version d'hibernate 4.3. est la suivante:

Configuration configuration = new Configuration().configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().
applySettings(configuration.getProperties());
SessionFactory factory = configuration.buildSessionFactory(builder.build());
3
kavi temre
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();
 }
1
Bharathiraja
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
Pratap A.K

Dans hibernate 5.3.1, vous pouvez essayer ceci:

ServiceRegistry standardRegistry = 
                new StandardServiceRegistryBuilder().configure().build();

Metadata sources = new MetadataSources(standardRegistry).addAnnotatedClass(MyEntity.class).getMetadataBuilder().build();

SessionFactory sf = sources.buildSessionFactory();
0
Quan VO

J'ai édité la méthode créée par batbaatar ci-dessus afin qu'il accepte l'objet de configuration en tant que paramètre:

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

Dans la classe principale j'ai fait:

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

Dans 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
saneryee

public void sampleConnection () lève 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
Creditto

il existe de nombreuses API déconseillées dans le cadre principal hibernate.

nous avons créé la fabrique de sessions comme ci-dessous:

SessionFactory sessionFactory = new Configuration (). Configure (). BuildSessionFactory ();

La méthode buildSessionFactory est obsolète depuis la version 4 de hibernate et elle est remplacée par la nouvelle API. Si vous utilisez la version 4.3.0 ou ultérieure d'Hibernate, votre code doit être:

  1. Configuration configuration = new Configuration (). Configure ();

  2. Générateur StandardServiceRegistryBuilder = new StandardServiceRegistryBuilder (). ApplySettings (configuration.getProperties ());

  3. SessionFactory Factory = configuration.buildSessionFactory (builder.build ());

La classe ServiceRegistryBuilder est remplacée par StandardServiceRegistryBuilder à partir de 4.3.0. Il semble y avoir beaucoup de changements dans la version 5.0. Il n’existe toujours pas beaucoup de clarté sur les API obsolètes et sur les alternatives appropriées à utiliser. Chaque version incrémentielle est associée à une API plus obsolète. Elle est en train de peaufiner le cadre principal de la version 5.0.

0
Creditto