2011-12-24 13 views
205

Quando ho aggiornato la versione di Hibernate da 3.6.8.final a 4.0.0.final ho ricevuto un avvertimento sul metodo deprecato buildSessionFactory() in questa linea:Is buildSessionFactory() deprecato in ibernazione 4?

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

javadoc raccomanda l'uso di un altro metodo

buildSessionFactory(ServiceRegistry serviceRegistry)

ma nel documentation ho trovato variante deprecato :(

mi potete aiutare con questo piccolo malinteso?

+0

Anche nella guida di avvio rapido 4.3.8 stanno utilizzando questo esempio: nuova configurazione() .configure(). BuildSessionFactory(); :( –

+0

@VenkataRaju Può essere, non è male, perché in Hibernate 5 tutto torna indietro e questo esempio è corretto, ma (!) Tutti gli esempi di configurazione qui sono [non valido per Hibernate 5] (http://stackoverflow.com/a/32711654/3405171). –

risposta

364

Sì, è deprecato. Sostituisci la tua SessionFactory con quanto segue:

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

UPDATE:

In Sospensione 4.3 ServiceRegistryBuilder è obsoleto. Usa invece il seguente.

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

Questo ha funzionato anche per me! Grazie! –

+6

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

+11

Sì, sembra che ServiceRegistryBuilder sia esso stesso deprecato, guardando la documentazione, suggeriscono invece l'uso di StandardServiceRegistryBuilder. Quindi suppongo che ora la chiamata dovrebbe essere la nuova StandardRegistryBuilder(). ApplySettings (configuration.getProperties()). Build(); –

4

È semplice: i documenti JBoss non sono perfettamente mantenuti al 100%. Vai con what the JavaDoc says: buildSessionFactory(ServiceRegistry serviceRegistry).

15

Sì, è deprecato. http://docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/cfg/Configuration.html#buildSessionFactory() indica specificamente di utilizzare l'altro metodo trovato (buildSessionFactory(ServiceRegistry serviceRegistry)), quindi utilizzarlo.

La documentazione viene copiata da release a release e probabilmente non è stata ancora aggiornata (non riscrivono il manuale con ogni versione), quindi affidati a Javadocs.

Le specifiche di questo cambiamento possono essere visualizzati in:

Alcuni riferimenti supplementari:

+0

quindi come facciamo le sessioni ora? qual è l'oggetto che è assegnato all'interfaccia serviceRegistry? –

+0

@IsmailMarmoush - Non ho ancora giocato con questo troppo, ma ho aggiunto alcuni riferimenti aggiuntivi – ziesemer

4

Non è raro trovare discrepanze tra le diverse versioni di documentazione. La maggior parte degli sviluppatori considera la documentazione un lavoro ingrato e tende a rimandare.

Come regola generale, se la javadoc dice una cosa e alcuni documenti non javadoc lo contraddicono, è probabile che la javadoc sia più accurata. I programmatori hanno più probabilità di mantenere la javadoc aggiornata con le modifiche al codice ... perché la "fonte" di javadoc si trova nello stesso file del codice.

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

+1

* ... e non li sottovalutano. * ... a meno che non si chiami 'System.getenv (String)' http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4199068 – bestsss

+1

È non è raro trovare progetti di crap, i cui pigri sviluppatori non si preoccupano di mantenere la documentazione allineata con il codice, in modo da far impazzire i loro utenti, mentre questi cercano di capire come funziona la maledetta spazzatura rovistando da sola e sperando che ci sia qualcosa g più di/** TODO: comment-me * /: - \ – zakmck

+0

@bestsss ... o si chiama 'Configuration.buildSessionFactory()';) –

6

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

    } 
} 
+0

In questo codice vengono utilizzati alcuni metodi deprecati. –

3

codice di verifica di lavorare in Hibernate 4.3.0. Si noti che è possibile rimuovere il parametro XML filename, oppure fornire il proprio percorso lì. Questo è simile a (ma errori di battitura corretti) 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); 
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(); 
} 
+0

Anche "StandardServiceRegistryBuilder" è deprecato. – NixRam

+0

@NitinRam 'StandardServiceRegistryBuilder' NON è deprecato. – JPG

+0

Stranamente, come vengono prese le cose e disattivato la deprecazione in Hibernate. Era ad un certo punto. http://stackoverflow.com/questions/17911308/looking-for-a-not-deprecated-session-factory – NixRam

0

pubblico sampleConnection void() throws 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

ho modificato il metodo creato da batbaatar above in modo che accetti l'oggetto di configurazione come parametro:

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

In la classe principale che ho fatto:

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

Basta importare seguente pacchetto,

import org.hibernate.cfg.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 sono molte API deprecate nel quadro nucleo di ibernazione. .

abbiamo creato la fabbrica di sessione come di seguito:

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

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

  1. configurazione Configurazione = new Configuration() configurare();.

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

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

Classe ServiceRegistryBuilder è sostituito da StandardServiceRegistryBuilder da 4.3.0. Sembra che ci saranno molte modifiche nella versione 5.0. Ancora non c'è molta chiarezza sulle API deprecate e le alternative adatte da usare.Ogni versione incrementale genera API più deprecate, sono in grado di mettere a punto il framework principale per la versione 5.0.

3

Un modo migliore per creare SessionFactory oggetto in ultima versione di ibernazione 4.3.0 in poi è la seguente:

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

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

2

Se si utilizza Hibernate 5.2 e al di sopra quindi è 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); 
    } 
    }