Czy metoda konfiguracji buildSessionFactory () jest nieaktualna w Hibernacji


215

Kiedy zaktualizowałem wersję Hibernacji z 3.6.8 do 4.0.0, dostałem ostrzeżenie o nieaktualnej metodzie buildSessionFactory()w tym wierszu:

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

Javadoc zaleca użycie innej metody

buildSessionFactory(ServiceRegistry serviceRegistry)

ale w dokumentacji znalazłem przestarzały wariant :(

Czy możesz mi pomóc z tym małym nieporozumieniem?


Nawet w skróconym przewodniku 4.3.8 używają tego przykładu: new Configuration () .configure (). BuildSessionFactory (); :(
Venkata Raju

@VenkataRaju Może być, nie jest źle, ponieważ w Hibernacji 5 wszystko się odwraca i ten przykład jest poprawny, ale (!) Wszystkie przykłady konfiguracji tutaj nieważne dla Hibernacji 5 .
v.ladynev

Odpowiedzi:


374

Tak, jest przestarzałe. Zamień swój SessionFactory na:

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

AKTUALIZACJA:

W Hibernacji 4.3 ServiceRegistryBuilder jest przestarzały . Zamiast tego użyj następujących.

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

6
org.hibernate.service.ServiceRegistryBuilder jest również depracowany!
Accollativo

11
Tak, wygląda na to, że ServiceRegistryBuilder jest przestarzały, patrząc na dokumentację, sugerują zamiast tego użycie StandardServiceRegistryBuilder. Sądzę więc, że wywołanie powinno być teraz nowym StandardRegistryBuilder (). ApplySettings (configuration.getProperties ()). Build ();
Simon B

Nie mogę znaleźć StandardRegistryBuilder w hibernacji 4.3. Czy to możliwe, że został tam zmieniony?
Dejell

7
Zamiast build () trzeba buildServiceRegistry (), prawda? Nie mogę znaleźć usługi ServiceRegistry.build ().
Herbert

43
Wydaje się, że misją zespołu hibernacji jest zaniechanie wszystkiego, co tworzą.
3urdoch

16

Tak, jest przestarzałe. http://docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/cfg/Configuration.html#buildSessionFactory () mówi konkretnie, abyś użył innej metody, którą znalazłeś ( buildSessionFactory(ServiceRegistry serviceRegistry)) - więc użyj jej.

Dokumentacja jest kopiowana z wydania na wydanie i prawdopodobnie po prostu nie została jeszcze zaktualizowana (nie przepisują instrukcji przy każdym wydaniu) - więc zaufaj Javadocs.

Szczegóły tej zmiany można zobaczyć na:

Niektóre dodatkowe odniesienia:


więc jak teraz robimy sesje? jaki jest obiekt przypisany do interfejsu serviceRegistry?
Ismail Marmoush

@IsmailMarmoush - Jeszcze nie grałem z tym zbyt wiele, ale dodałem kilka dodatkowych odniesień.
ziesemer

7

lub

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

    }
}

Niektóre przestarzałe metody są używane w tym kodzie.
Kevin Bowersox

6

Kod zweryfikowany do pracy w Hibernacji 4.3.0. Zauważ, że możesz usunąć parametr nazwy pliku XML lub podać własną ścieżkę. Jest to podobne do (ale poprawionych literówek) innych postów tutaj, ale ten jest poprawny.

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

Lepszy sposób na utworzenie obiektu SessionFactory w najnowszej wersji hibernacji 4.3.0 i nowszej jest następujący:

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

pobieranie błędu: Metoda buildSessionFactory () w typie Konfiguracja nie ma zastosowania do argumentów (StandardServiceRegistry)
Anju

4

Nie jest niczym niezwykłym znalezienie rozbieżności między różnymi wersjami dokumentacji. Większość programistów uważa dokumentację za obowiązek i odkłada ją na później.

Zasadniczo, jeśli javadoc mówi jedną rzecz, a niektóre dokumenty inne niż javadoc zaprzeczają temu, istnieje prawdopodobieństwo, że javadoc jest dokładniejszy. Programiści częściej aktualizują javadoc o zmiany w kodzie ... ponieważ „źródło” javadoc znajduje się w tym samym pliku co kod.

W przypadku @deprecatedtagów wirtualna pewność, że javadoc jest dokładniejsza. Programiści wycofują rzeczy po starannym rozważeniu ... i (ogólnie rzecz biorąc) nie cofają ich.


1
... i nie zaniedbują ich. ... chyba że nazywa się to System.getenv(String) bugs.sun.com/bugdatabase/view_bug.do?bug_id=4199068
bestsss

1
Nie jest niczym niezwykłym znalezienie bzdurnych projektów, których leniwi programiści nie zawracają sobie głowy dostosowaniem dokumentacji do kodu, aby doprowadzali użytkowników do szaleństwa, podczas gdy ci próbują dowiedzieć się, jak działają cholerne śmieci, grzebiąc w sobie i mając nadzieję, że tam to coś więcej niż / ** DO ZROBIENIA: comment-me * /: - \
zakmck

@bestsss ... lub to się nazywa Configuration.buildSessionFactory();)
v.ladynev

3

Jeśli używasz Hibernacji 5.2 i nowszych, możesz użyć tego:

  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

Tak to jest. Są lepsze sposoby na bootowanie Hibernacji, takie jak następujące.

Hibernacja-natywny bootstrap

Wcześniejszy Configurationobiekt jest mniej wydajny niż użycie BootstrapServiceRegistryBuilder, wprowadzonego od Hibernacji 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

Możesz także uruchomić Hibernację przy użyciu 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();

W ten sposób budujesz EntityManagerFactoryzamiast SessionFactory. Jednak SessionFactoryrozszerza również EntityManagerFactory, so the actual object that's built is aSessionFactoryImpl`.

Wniosek

Te dwie metody ładowania mają wpływ na zachowanie Hibernacji. Podczas korzystania z natywnego bootstrapu Hibernacja zachowuje się w starszym trybie, który jest wcześniejszy niż JPA.

Podczas ładowania przy użyciu JPA Hibernacja będzie się zachowywać zgodnie ze specyfikacją JPA.

Istnieje kilka różnic między tymi dwoma trybami:

Aby uzyskać więcej informacji na temat tych różnic, sprawdź JpaComplianceklasę.


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

„StandardServiceRegistryBuilder” również jest przestarzałe.
NixRam

@NitinRam StandardServiceRegistryBuilderNIE jest przestarzałe.
JPG

Całkiem dziwne, jak rzeczy są włączane i wyłączane jako przestarzałe w Hibernacji. Kiedyś tak było. stackoverflow.com/questions/17911308/…
NixRam

0

public void sampleConnection () zgłasza wyjątek {

     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

Zredagowałem metodę utworzoną przez batbaatar powyżej, więc akceptuje obiekt Configuration jako parametr:

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

W klasie głównej zrobiłem:

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

0

W Hibernacji 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

oto wiele interfejsów API przestarzałych w hibernowanym środowisku szkieletowym.

stworzyliśmy fabrykę sesji, jak poniżej:

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

Metoda buildSessionFactory jest przestarzała z wersji hibernacji 4 i została zastąpiona nowym interfejsem API. Jeśli używasz hibernacji 4.3.0 i nowszych, twój kod musi być:

  1. Konfiguracja konfiguracji = nowa konfiguracja (). Config ();

  2. Konstruktor StandardServiceRegistryBuilder = nowy StandardServiceRegistryBuilder (). ApplySettings (configuration.getProperties ());

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

Klasa ServiceRegistryBuilder została zastąpiona przez StandardServiceRegistryBuilder z 4.3.0. Wygląda na to, że będzie wiele zmian w wersji 5.0. Nadal brak jest jasności w odniesieniu do przestarzałych interfejsów API i odpowiednich alternatyw do użycia. Każda wersja przyrostowa zawiera bardziej przestarzałe API, są one w stanie dopracować podstawową strukturę wydania 5.0.


0

W hibernate 5.3.1możesz spróbować tego:

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

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

SessionFactory sf = sources.buildSessionFactory();

0

Jeśli ktoś tutaj po aktualizacji do 5.1, tak to działa

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

zamiast poniżej w hibernacji 4.3

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.