62 votes

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?

70voto

Love Hasija Points 837

Oui, ils ont désapprouvé les précédentes buildSessionFactory API, et il est assez facile de faire du bien.. vous pouvez faire quelque chose comme ça..

EDIT : 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 référence, en profondeur et en détail, vous pouvez consulter la hibernate officielle de cas de test à https://github.com/hibernate/hibernate-orm/blob/master/hibernate-testing/src/main/java/org/hibernate/testing/junit4/BaseCoreFunctionalTestCase.java fonction (buildSessionFactory()).

18voto

Lalo Points 111

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

11voto

ZE pixota Points 101
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();

7voto

Andrei Amariei Points 836

Le suivant exprime l'expérience que j'ai eu avec hibernate 4.0.0.Final.

La javadoc (distribué sous licence LGPL) org.hibernate.cfg.Configuration classe stipule que:

NOTE : Ce sera remplacée par l'utilisation d' ServiceRegistryBuilderet org.hibernate.metamodel.MetadataSources au lieu de cela, après la version 4.0 à quel point cette classe va devenir obsolètes et devraient être supprimés dans la version 5.0. Voir HHH-6183, HHH-2578et HHH-6586 pour plus de détails

Après avoir regardé 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 démarrer la lecture de la configuration, j'ai dû modifier mon hibernate 3.2.6 de la configuration et des fichiers de mappage d'utiliser xmlns="http://www.hibernate.org/xsd/hibernate-configuration" et xmlns="http://www.hibernate.org/xsd/hibernate-mapping" et également supprimer la dtd cahier des charges.

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

Cela peut fonctionner pour certains.

J'ai, pour l'une, a couru dans une erreur, car la cartographie des fichiers contenus <cache usage="read-write" /> et s'est terminé vers le haut en utilisant déconseillé de Configuration de voie:

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û par programmation d'ajouter des écouteurs d'événement, parce que la Configuration ne regarde plus dans hibernate.cfg.xml

5voto

Krishna Points 1602

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 la création de la fabrique de session ressemblerait à cet exemple lors de la création d'une fabrique de session .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X