Ist die Konfigurationsmethode buildSessionFactory () im Ruhezustand veraltet?

215

Als ich die Hibernate-Version von 3.6.8 auf 4.0.0 aktualisiert habe, wurde buildSessionFactory()in dieser Zeile eine Warnung bezüglich einer veralteten Methode angezeigt :

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

Der Javadoc empfiehlt die Verwendung einer anderen Methode

buildSessionFactory(ServiceRegistry serviceRegistry)

aber in der Dokumentation fand ich veraltete Variante :(

Können Sie mir bei diesem kleinen Missverständnis helfen?

pushistisch
quelle
Selbst in der Kurzanleitung 4.3.8 verwenden sie dieses Beispiel: new Configuration () .configure (). BuildSessionFactory (); :(
Venkata Raju
@VenkataRaju Möglicherweise ist es nicht schlecht, da in Hibernate 5 alles zurückkehrt und dieses Beispiel korrekt ist, aber (!) Alle Konfigurationsbeispiele hier sind für Hibernate 5 nicht gültig .
v.ladynev

Antworten:

374

Ja, es ist veraltet. Ersetzen Sie Ihre SessionFactory durch Folgendes:

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

AKTUALISIEREN:

In Hibernate 4.3 ist ServiceRegistryBuilder veraltet . Verwenden Sie stattdessen Folgendes.

serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
            configuration.getProperties()).build();
Batbaatar
quelle
6
org.hibernate.service.ServiceRegistryBuilder ist ebenfalls entstellt!
Accollativo
11
Ja, es scheint, dass ServiceRegistryBuilder selbst veraltet ist. In der Dokumentation wird empfohlen, stattdessen StandardServiceRegistryBuilder zu verwenden. Ich denke, der Aufruf sollte jetzt neu sein StandardRegistryBuilder (). ApplySettings (configuration.getProperties ()). Build ();
Simon B
Ich kann StandardRegistryBuilder im Ruhezustand 4.3 nicht finden. Könnte es sein, dass es dort geändert wurde?
Dejell
7
Anstelle von build () braucht man buildServiceRegistry (), oder? Ich kann ServiceRegistry.build () nicht finden.
Herbert
43
Es scheint die Mission des Winterschlaf-Teams zu sein, alles, was sie schaffen, zu verwerfen.
3urdoch
16

Ja, es ist veraltet. http://docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/cfg/Configuration.html#buildSessionFactory () weist Sie ausdrücklich an, die andere Methode zu verwenden, die Sie stattdessen gefunden haben ( buildSessionFactory(ServiceRegistry serviceRegistry)) - verwenden Sie sie also.

Die Dokumentation wird von Release zu Release kopiert und wahrscheinlich noch nicht aktualisiert (das Handbuch wird nicht bei jedem Release neu geschrieben) - vertrauen Sie also den Javadocs.

Die Einzelheiten dieser Änderung können unter folgender Adresse eingesehen werden:

Einige zusätzliche Referenzen:

ziesemer
quelle
Wie machen wir jetzt Sitzungen? Was ist das Objekt, das der serviceRegistry-Schnittstelle zugewiesen ist?
Ismail Marmoush
@IsmailMarmoush - Ich habe noch nicht zu viel damit gespielt, aber einige zusätzliche Referenzen hinzugefügt.
ziesemer
7

oder

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

    }
}
Mischungz
quelle
In diesem Code werden einige veraltete Methoden verwendet.
Kevin Bowersox
6

Code wurde überprüft, um in Hibernate 4.3.0 zu funktionieren. Beachten Sie, dass Sie den XML-Dateinamenparameter entfernen oder dort Ihren eigenen Pfad angeben können. Dies ist ähnlich (aber Tippfehler korrigiert) anderen Posts hier, aber dieser ist korrekt.

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);
MADHAIYAN M.
quelle
4

So einfach ist das: Die JBoss-Dokumente sind nicht zu 100% perfekt gepflegt. Gehen Sie mit dem, was der JavaDoc sagt : buildSessionFactory(ServiceRegistry serviceRegistry).

Matt Ball
quelle
4

Ein besserer Weg, um ein SessionFactory- Objekt in der neuesten Version 4.3.0 für den Ruhezustand zu erstellen, ist folgender:

Configuration configuration = new Configuration().configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().
applySettings(configuration.getProperties());
SessionFactory factory = configuration.buildSessionFactory(builder.build());
kavi temre
quelle
Fehler erhalten: Die Methode buildSessionFactory () im Typ Konfiguration ist nicht anwendbar für die Argumente (StandardServiceRegistry)
Anju
4

Es ist nicht ungewöhnlich, Diskrepanzen zwischen verschiedenen Dokumentationsversionen zu finden. Die meisten Entwickler betrachten Dokumentation als lästige Pflicht und neigen dazu, sie zu verschieben.

Als Faustregel gilt: Wenn der Javadoc eine Sache sagt und eine Nicht-Javadoc-Dokumentation dem widerspricht, besteht die Möglichkeit, dass der Javadoc genauer ist. Programmierer halten das Javadoc mit größerer Wahrscheinlichkeit über Änderungen am Code auf dem Laufenden ... da sich die "Quelle" für das Javadoc in derselben Datei wie der Code befindet.

Bei @deprecatedTags ist es eine virtuelle Gewissheit, dass das Javadoc genauer ist. Entwickler lehnen Dinge nach sorgfältiger Überlegung ab ... und (im Allgemeinen) sie missbilligen sie nicht.

Stephen C.
quelle
1
... und sie unterschätzen sie nicht. ... es sei denn, es heißt System.getenv(String) bugs.sun.com/bugdatabase/view_bug.do?bug_id=4199068
bestsss
1
Es ist nicht ungewöhnlich, Mistprojekte zu finden, deren faule Entwickler sich nicht darum kümmern, die Dokumentation mit dem Code in Einklang zu bringen, damit sie ihre Benutzer verrückt machen, während diese versuchen, herauszufinden, wie der blutige Müll funktioniert, indem sie in sich selbst stöbern und dort hoffen ist etwas mehr als / ** TODO: comment-me * /: - \
zakmck
@bestsss ... oder es heißt Configuration.buildSessionFactory();)
v.ladynev
3

Wenn Sie Hibernate 5.2 und höher verwenden, können Sie Folgendes verwenden:

  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);
    }
  }
Hasan K.
quelle
2

TL; DR

Ja, so ist es. Es gibt bessere Möglichkeiten, den Ruhezustand zu booten, wie die folgenden.

Eingeborener Bootstrap im Ruhezustand

Das Legacy- ConfigurationObjekt ist weniger leistungsfähig als das BootstrapServiceRegistryBuilderseit Hibernate 4 eingeführte:

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

JPA-Bootstrap

Sie können den Ruhezustand auch mit JPA booten:

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

Auf diese Weise bauen Sie das EntityManagerFactoryanstelle eines SessionFactory. Das SessionFactoryerweitert jedoch auch die EntityManagerFactory, so the actual object that's built is aSessionFactoryImpl`.

Fazit

Diese beiden Bootstrapping-Methoden wirken sich auf das Verhalten im Ruhezustand aus. Bei Verwendung des nativen Bootstraps verhält sich der Ruhezustand im Legacy-Modus, der vor JPA liegt.

Beim Bootstrapping mit JPA verhält sich der Ruhezustand gemäß der JPA-Spezifikation.

Es gibt verschiedene Unterschiede zwischen diesen beiden Modi:

  • Funktionsweise des AUTO-Flush-Modus in Bezug auf native SQL-Abfragen
  • Wie der Entitätsproxy erstellt wird. Traditionell hat Hibernate die DB beim Erstellen eines Proxys nicht getroffen, aber JPA erfordert das Auslösen eines EntityNotFoundExceptionund fordert daher eine DB-Prüfung.
  • ob Sie eine nicht verwaltete Entität löschen können

Weitere Informationen zu diesen Unterschieden finden Sie in der JpaComplianceKlasse.

Vlad Mihalcea
quelle
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();
 }
Bharathiraja
quelle
'StandardServiceRegistryBuilder' ist ebenfalls veraltet.
NixRam
@NitinRam StandardServiceRegistryBuilderist NICHT veraltet.
JPG
Ziemlich seltsam, wie Dinge im Ruhezustand ein- und ausgeschaltet werden. Früher war es an einem Punkt. stackoverflow.com/questions/17911308/…
NixRam
0

public void sampleConnection () löst eine Ausnahme aus {

     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.");
}
Creditto
quelle
0

Ich habe die oben von batbaatar erstellte Methode so bearbeitet, dass das Konfigurationsobjekt als Parameter akzeptiert wird:

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

In der Hauptklasse habe ich gemacht:

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

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

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

    }

}
Pratap AK
quelle
0

Hier sind viele APIs im Ruhezustand-Kernframework veraltet.

Wir haben die Session Factory wie folgt erstellt:

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

Die Methode buildSessionFactory ist in der Version 4 für den Ruhezustand veraltet und wird durch die neue API ersetzt. Wenn Sie den Ruhezustand 4.3.0 und höher verwenden, muss Ihr Code wie folgt lauten:

  1. Konfigurationskonfiguration = neue Konfiguration (). Configure ();

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

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

Die Klasse ServiceRegistryBuilder wird ab 4.3.0 durch StandardServiceRegistryBuilder ersetzt. Es sieht so aus, als ob es in der Version 5.0 viele Änderungen geben wird. Es gibt immer noch nicht viel Klarheit über die veralteten APIs und die geeigneten Alternativen. Jede inkrementelle Version enthält eine veraltete API. Sie dient der Feinabstimmung des Kernframeworks für Version 5.0.

Creditto
quelle
0

In hibernate 5.3.1können Sie dies versuchen:

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

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

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

Wenn jemand nach dem Update auf 5.1 hier ist, funktioniert das so

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

anstelle der folgenden im Ruhezustand 4.3

 ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(
            configuration.getProperties()). buildServiceRegistry();
    sessionFactory = configuration.buildSessionFactory(serviceRegistry);
Lila
quelle
-1

Einfach folgendes Paket importieren,

import org.hibernate.cfg.Configuration;
Prasad Bhosale
quelle