web-dev-qa-db-fra.com

Créer une fabrique de sessions dans Hibernate 4

Je ne parviens pas à générer une session factory dans Hibernate 4. Dans Hibernate 3, j'ai simplement:

org.hibernate.cfg.Configuration conf= HibernateUtil
    .getLimsInitializedConfiguration(systemConfiguration
.getHibernateconfFile());

SessionFactory sf = conf.configure().buildSessionFactory();

Maintenant, je dois passer une classe ServiceRegistry à buildSessionFactory, mais les Javadocs sont extrêmement vagues sur la façon de procéder. Des conseils?

62
MTR

Oui, ils ont obsolète la précédente API buildSessionFactory, et il est très facile de bien le faire .. vous pouvez faire quelque chose comme ça ..

[~ # ~] éditer [~ # ~] : ServiceRegistryBuilder est obsolète. vous devez utiliser 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.");
    }

Pour plus de détails et plus de détails, vous pouvez consulter le scénario de test officiel de l'hibernation à l'adresse https: //github.com/hibernate/hibernate-orm/blob/master/hibernate-testing/src/main/Java/org /hibernate/testing/junit4/BaseCoreFunctionalTestCase.Java fonction (buildSessionFactory ()).

70
Love Hasija

Essaye ça!

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;
    } 
}
18
Lalo
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();
11
ZE pixota

Ce qui suit exprime l'expérience que j'ai eu avec hibernate 4.0.0.Final.

Le javadoc (distribué sous licence LGPL) de org.hibernate.cfg.Configuration La classe déclare que:

NOTE: Ceci sera remplacé par l'utilisation de ServiceRegistryBuilder et org.hibernate.metamodel.MetadataSources au lieu de cela après la version 4.0, cette classe deviendra obsolète et sa suppression est prévue dans la version 5.0. Voir HHH-618 , HHH-2578 et HHH-6586 pour plus de détails.

Après avoir examiné le problème 2578, j'ai utilisé quelque chose comme ceci:

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

Pour commencer à lire la configuration, j’ai dû modifier mes fichiers de configuration et de mappage Hibernate 3.2.6 pour utiliser xmlns="http://www.hibernate.org/xsd/hibernate-configuration" et xmlns="http://www.hibernate.org/xsd/hibernate-mapping" et aussi supprimer les spécifications de dtd.

Je ne pouvais pas lui trouver le moyen d'inspecter les mappages définis dans hibernate.cfg.xml et le préfixe . des propriétés liées à hibernate dans hibernate.cfg.xml n'est plus facultatif.

Cela pourrait fonctionner pour certains.

Pour ma part, j'ai rencontré une erreur car les fichiers de mappage contenaient <cache usage="read-write" /> et a fini par utiliser une méthode de configuration obsolète:

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

J'ai dû ajouter par programme des écouteurs d'événements car la configuration ne les recherche plus dans hibernate.cfg.xml

7
Andrei Amariei

Même il y a une mise à jour dans la 4.3.0 API. ServiceRegistryBuilder est également obsolète en 4.3.0 et remplacé par StandardServiceRegistryBuilder. Maintenant, le code réel pour créer la fabrique de session ressemblerait à ceci exemple sur la création d'une fabrique de session .

5
Krishna

[citation de http://www.javabeat.net/session-factory-hibernate-4/]

Il existe de nombreuses API déconseillées dans le cadre principal hibernate. L’un des points frustrants à l’heure actuelle est que la documentation officielle de Hibernate ne fournit pas d’instructions claires sur l’utilisation de la nouvelle API et indique que la documentation est complète. De plus, chaque version incrémentielle reçoit des modifications sur certaines des API importantes. Une de ces choses est la nouvelle API permettant de créer la fabrique de sessions dans Hibernate 4.3.0 sous Windows. Dans nos versions précédentes, nous avons créé la fabrique de sessions comme suit:

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

La méthode buildSessionFactory est déconseillée dans 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:

Configuration configuration = new Configuration().configure();

StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());

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 à des API plus obsolètes. Elle est en train de peaufiner le cadre de base de la version 5.0.

2
Kuan

Dans les versions précédentes, la fabrique de sessions était créée comme suit:

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 ressembler à ceci:

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

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

Configuration configuration = new Configuration().configure();

StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
        .applySettings(configuration.getProperties());

SessionFactory factory = configuration.buildSessionFactory(builder.build());
1
user3198259