Il metodo di configurazione buildSessionFactory () è obsoleto in Hibernate


215

Quando ho aggiornato la versione di Hibernate dalla 3.6.8 alla 4.0.0, ho ricevuto un avviso sul metodo obsoleto buildSessionFactory()in questa riga:

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

Javadoc consiglia di utilizzare un altro metodo

buildSessionFactory(ServiceRegistry serviceRegistry)

ma nel documentazione ho trovato una variante deprecata :(

Potete aiutarmi con questo piccolo malinteso?


Anche nella Guida di avvio rapido 4.3.8 stanno usando questo esempio: new Configuration () .configure (). BuildSessionFactory (); :(
Venkata Raju,

@VenkataRaju Può essere, non è male, perché in Hibernate 5 tutto torna indietro e questo esempio è corretto, ma (!) Tutti gli esempi di configurazione qui non sono validi per Hibernate 5 .
v.ladynev,

Risposte:


374

Sì, è obsoleto. Sostituisci SessionFactory con il seguente:

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

AGGIORNARE:

In Hibernate 4.3 ServiceRegistryBuilder è obsoleto . Utilizzare invece quanto segue.

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

6
org.hibernate.service.ServiceRegistryBuilder è anche depracato!
Accollativo

11
Sì, sembra che ServiceRegistryBuilder sia esso stesso deprecato, guardando la documentazione, suggeriscono invece di utilizzare StandardServiceRegistryBuilder. Quindi suppongo che ora la chiamata dovrebbe essere new StandardRegistryBuilder (). ApplySettings (configuration.getProperties ()). Build ();
Simon B,

Non riesco a trovare StandardRegistryBuilder in ibernazione 4.3 potrebbe essere che è stato modificato lì?
Dejell,

7
Invece di build () è necessario buildServiceRegistry (), giusto? Non riesco a trovare ServiceRegistry.build ().
Herbert

43
Sembra che sia la missione del team di ibernazione di deprecare tutto ciò che creano.
3

16

Sì, è obsoleto. http://docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/cfg/Configuration.html#buildSessionFactory () ti dice specificamente di usare l'altro metodo che hai trovato invece ( buildSessionFactory(ServiceRegistry serviceRegistry)) - quindi usalo.

La documentazione viene copiata da una versione all'altra e probabilmente non è stata ancora aggiornata (non riscrivono il manuale ad ogni versione), quindi affidati a Javadocs.

Le specifiche di questa modifica possono essere visualizzate su:

Alcuni riferimenti aggiuntivi:


quindi come facciamo sessioni ora? qual è l'oggetto assegnato all'interfaccia serviceRegistry ??
Ismail Marmoush,

@IsmailMarmoush - Non ci ho ancora giocato troppo, ma ho aggiunto alcuni riferimenti aggiuntivi.
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();

    }
}

In questo codice vengono utilizzati alcuni metodi obsoleti.
Kevin Bowersox,

6

Codice verificato per funzionare in Hibernate 4.3.0. Si noti che è possibile rimuovere il parametro del nome file XML oppure fornire lì il proprio percorso. Questo è simile (ma corretto) ad altri post qui, ma questo è corretto.

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

Un modo migliore per creare l' oggetto SessionFactory dalla versione più recente della versione 4.3.0 in poi è il seguente:

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

ottenere errore: il metodo buildSessionFactory () nel tipo Configuration non è applicabile per gli argomenti (StandardServiceRegistry)
Anju

4

Non è insolito trovare discrepanze tra le diverse versioni della documentazione. La maggior parte degli sviluppatori considera la documentazione come un lavoro ingrato e tende a rimandarla.

Come regola generale, se il javadoc dice una cosa e una documentazione non javadoc lo contraddice, è probabile che il javadoc sia più preciso. È più probabile che i programmatori mantengano aggiornato javadoc con le modifiche al codice ... perché il "sorgente" per javadoc si trova nello stesso file del codice.

Nel caso dei @deprecatedtag, è una certezza virtuale che il javadoc sia più preciso. Gli sviluppatori deprecano le cose dopo un'attenta considerazione ... e (in generale) non le deprecano.


1
... e non li indeboliscono. ... a meno che non si chiami System.getenv(String) bugs.sun.com/bugdatabase/view_bug.do?bug_id=4199068
bestsss

1
Non è insolito trovare progetti di merda, i cui sviluppatori pigri non si preoccupano di mantenere la documentazione allineata al codice, in modo da far impazzire i loro utenti, mentre questi cercano di capire come funziona la maledetta immondizia frugando in se stessa e sperando lì è qualcosa di più di / ** TODO: comment-me * /: - \
zakmck

@bestsss ... o si chiama Configuration.buildSessionFactory();)
v.ladynev il

3

Se si utilizza Hibernate 5.2 e versioni successive, è possibile utilizzare questo:

  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ì. Esistono modi migliori per avviare Hibernate, come i seguenti.

Bootstrap nativo di ibernazione

L' Configurationoggetto legacy è meno potente dell'uso di BootstrapServiceRegistryBuilder, introdotto da 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

Puoi anche avviare bootstrap Hibernate usando 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();

In questo modo, stai costruendo EntityManagerFactoryinvece di a SessionFactory. Tuttavia, SessionFactoryestende EntityManagerFactory, so the actual object that's built is aanche SessionFactoryImpl`.

Conclusione

Questi due metodi di bootstrap influiscono sul comportamento di ibernazione. Quando si utilizza il bootstrap nativo, Hibernate si comporta in modalità legacy, che precede JPA.

Quando si avvia il bootstrap utilizzando JPA, Hibernate si comporterà in base alle specifiche JPA.

Esistono diverse differenze tra queste due modalità:

Per maggiori dettagli su queste differenze, dai un'occhiata alla JpaComplianceclasse.


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

Anche 'StandardServiceRegistryBuilder' è obsoleto.
NixRam,

@NitinRam StandardServiceRegistryBuilderNON è deprecato.
JPG

È abbastanza strano come le cose vengano prese e rimosse dalla deprecazione a Hibernate. Era ad un certo punto. stackoverflow.com/questions/17911308/...
NixRam

0

public void sampleConnection () genera l'eccezione {

     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

Ho modificato il metodo creato da Batbaatar sopra in modo che accetti l'oggetto Configuration come parametro:

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

Nella classe principale ho fatto:

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

0

In 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

qui ci sono molte API deprecate nel framework di base ibernazione.

abbiamo creato la factory di sessione come di seguito:

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

Il metodo buildSessionFactory è obsoleto dalla versione 4 di ibernazione e viene sostituito con la nuova API. Se si utilizza l'ibernazione 4.3.0 e successive, il codice deve essere:

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

  2. Generatore StandardServiceRegistryBuilder = new StandardServiceRegistryBuilder (). ApplySettings (configuration.getProperties ());

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

Class ServiceRegistryBuilder è sostituito da StandardServiceRegistryBuilder dalla 4.3.0. Sembra che ci saranno molte modifiche nella versione 5.0. Non c'è ancora molta chiarezza sulle API deprecate e sulle alternative adatte da usare. Ogni versione incrementale presenta API più obsolete, sono in grado di perfezionare il framework di base per la versione 5.0.


0

In hibernate 5.3.1, puoi provare questo:

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

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

SessionFactory sf = sources.buildSessionFactory();

0

Se qualcuno qui dopo l'aggiornamento a 5.1 è così che funziona

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

invece del sotto in ibernazione 4.3

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

-1

Importa solo il seguente pacchetto,

import org.hibernate.cfg.Configuration;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.