Hazırda Bekletme'de buildSessionFactory () Yapılandırma yöntemi kullanımdan kaldırıldı mı?


215

Hazırda Bekleme sürümünü 3.6.8'den 4.0.0'a güncellediğimde, buildSessionFactory()bu satırda kullanımdan kaldırılan yöntem hakkında bir uyarı aldım :

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

Javadoc başka bir yöntem kullanmanızı önerir

buildSessionFactory(ServiceRegistry serviceRegistry)

ancak belgelerde kullanımdan kaldırılmış varyant buldum :(

Bu küçük yanlış anlamada bana yardım edebilir misin?


4.3.8 hızlı başlangıç ​​kılavuzunda bile bu örneği kullanıyorlar: new Configuration () .configure (). BuildSessionFactory (); :(
Venkata Raju

@VenkataRaju Belki de kötü değil, çünkü Hazırda Bekletme 5'de her şey geri dönüyor ve bu örnek doğru, ancak (!) Buradaki tüm yapılandırma örnekleri Hazırda Bekletme 5 için geçerli değil .
v.ladynev

Yanıtlar:


374

Evet, kullanımdan kaldırıldı. SessionFactory'nizi aşağıdaki ile değiştirin:

In hazırda 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;
}

GÜNCELLEME:

In hazırda 4.3 ServiceRegistryBuilder edilir kullanımdan kaldırıldı . Bunun yerine aşağıdakileri kullanın.

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

6
org.hibernate.service.ServiceRegistryBuilder da küçümsendi!
Accollativo

11
Evet, ServiceRegistryBuilder'ın kendisi kullanımdan kaldırılmış gibi görünüyor, belgelere bakarak bunun yerine StandardServiceRegistryBuilder kullanılmasını öneriyorlar. Bu yüzden çağrı artık yeni StandardRegistryBuilder () olmalıdır. ApplySettings (configuration.getProperties ()). Build ();
Simon B

Hazırda bekletme 4.3 StandardRegistryBuilder bulamıyorum orada değiştirilmiş olabilir?
Dejell

7
Build () yerine bir buildServiceRegistry () gerekir, değil mi? ServiceRegistry.build () öğesini bulamıyorum.
Herbert

43
Görünüşe göre, hazırda bekletme ekibinin yarattıkları her şeyi reddetmek.
3urdoch

16

Evet, kullanımdan kaldırıldı. http://docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/cfg/Configuration.html#buildSessionFactory () özellikle bulduğunuz diğer yöntemi kullanmanızı söyler ( buildSessionFactory(ServiceRegistry serviceRegistry)) - bu yüzden kullanın.

Belgeler sürümden sürüme kopyalanır ve büyük olasılıkla henüz güncellenmemiştir (kılavuzu her sürümde yeniden yazmazlar) - Javadoc'lara güvenin.

Bu değişikliğin ayrıntıları şu adreste görülebilir:

Bazı ek referanslar:


peki şimdi nasıl oturum açacağız? serviceRegistry arabirimine atanan nesne nedir ??
Ismail Marmoush

@IsmailMarmoush - Bununla çok fazla oynamadım, ancak bazı ek referanslar ekledim.
ziesemer

7

veya

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

    }
}

Bu kodda kullanımdan kaldırılan bazı yöntemler kullanılıyor.
Kevin Bowersox

6

Hazırda Bekletme 4.3.0'da çalıştığı doğrulanan kod. XML dosya adı parametresini kaldırabileceğinize veya orada kendi yolunuzu sağlayabileceğinize dikkat edin. Bu, buradaki diğer gönderilere benzer (ancak yazım hataları düzeltildi), ancak bu doğru.

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

Bu kadar basit: JBoss belgeleri% 100 mükemmel bakımlı değil. İle gidin javadoc diyor : buildSessionFactory(ServiceRegistry serviceRegistry).


4

En son hazırda bekleme 4.3.0 ve sonrasında SessionFactory nesnesi oluşturmanın daha iyi bir yolu aşağıdaki gibidir:

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

hata alıyorum: Configuration türündeki buildSessionFactory () yöntemi bağımsız değişkenler için geçerli değildir (StandardServiceRegistry)
Anju

4

Farklı dokümantasyon sürümleri arasında tutarsızlıklar bulmak olağandışı değildir. Çoğu geliştirici, belgeleri bir angarya olarak görür ve erteleme eğilimindedir.

Genel bir kural olarak, eğer javadoc bir şey söylüyorsa ve javadoc olmayan bazı belgeler bununla çelişiyorsa, javadocun daha doğru olma ihtimali vardır. Programcıların javadoc'u koddaki değişikliklerle güncel tutma olasılığı daha yüksektir, çünkü javadoc için "kaynak" kodla aynı dosyadadır.

Durumunda @deprecatedetiketleri, bu javadoc daha doğru olduğunu sanal bir kesinlik. Geliştiriciler dikkatli bir şekilde değerlendirildikten sonra bazı şeyleri reddediyorlar ... ve (genel olarak konuşursak) onları tanımlamıyorlar.


1
... ve onları tarif etmediler. ... System.getenv(String) bugs.sun.com/bugdatabase/view_bug.do?bug_id=4199068
bestsss

1
Tembel geliştiricileri belgeleri kodla uyumlu tutmakla uğraşmayan bok projeleri bulmak olağandışı değil, böylece kullanıcılarını çıldırıyorlar, bunlar kanlı çöpün kendi içinde dolaşarak ve orada umut ederek nasıl çalıştığını anlamaya çalışıyorlar. / **
TODO'dan

@bestsss ... ya da denir Configuration.buildSessionFactory();)
v.ladynev

3

Hazırda Bekleme 5.2 ve üstünü kullanıyorsanız , bunu kullanabilirsiniz:

  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

Evet öyle. Hazırda Beklet'i önyüklemenin aşağıdaki gibi daha iyi yolları vardır.

Hazırda bekletme-yerel önyükleme

Eski Configurationnesne, BootstrapServiceRegistryBuilderHazırda Bekletme 4'ten beri sunulan , kullanmaktan daha az güçlüdür :

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 önyükleme

Hazırda Bekletme'yi JPA kullanarak da önyükleme yapabilirsiniz:

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

Bu şekilde EntityManagerFactorya yerine SessionFactory. Ancak, SessionFactoryImpl` de SessionFactoryuzanır EntityManagerFactory, so the actual object that's built is a.

Sonuç

Bu iki önyükleme yöntemi Hazırda Bekletme davranışını etkiler. Yerel önyükleme kullanılırken Hazırda Beklet, JPA'dan önceki eski modda çalışır.

JPA kullanarak önyükleme yaparken, Hazırda Beklet JPA belirtimine göre davranacaktır.

Bu iki mod arasında birkaç fark vardır:

Bu farklılıklar hakkında daha fazla bilgi için JpaCompliancesınıfa göz atın.


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' kullanımdan kaldırıldı.
NixRam

@NitinRam StandardServiceRegistryBuilderonaylanmadı.
JPG

Hazırda Bekletme'de işlerin kullanımdan kaldırılıp nasıl kaldırılacağı oldukça garip. Eskiden bir noktadaydı. stackoverflow.com/questions/17911308/…
NixRam

0

public void sampleConnection () istisna atar {

     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

Yukarıdaki batbaatar tarafından oluşturulan yöntemi düzenledi, böylece Configuration nesnesini parametre olarak kabul etti:

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

Ana sınıfta yaptım:

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

0

In hazırda 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

burada hazırda bekletme çekirdeği çerçevesinde kullanılmayan birçok API bulunmaktadır.

biz oturum fabrika oluşturduk aşağıdaki gibi:

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

BuildSessionFactory yöntemi hazırda bekletme 4 sürümünden kaldırılmıştır ve yerine yeni API getirilmiştir. Hazırda bekletme 4.3.0 ve üstünü kullanıyorsanız, kodunuz aşağıdaki gibi olmalıdır:

  1. Yapılandırma configuration = new Configuration (). Configure ();

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

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

Sınıf ServiceRegistryBuilder yerine 4.3.0 yerine StandardServiceRegistryBuilder kullanılır. 5.0 sürümünde çok fazla değişiklik olacak gibi görünüyor. Yine de kullanımdan kaldırılmış API'ler ve kullanım için uygun alternatifler konusunda fazla netlik yoktur. Her artımlı sürüm daha kullanımdan kaldırılmış API ile gelir, sürüm 5.0 için temel çerçevenin ince ayarını yaparlar.


0

İçinde şunu hibernate 5.3.1deneyebilirsiniz:

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

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

SessionFactory sf = sources.buildSessionFactory();

0

5.1 sürümüne güncelledikten sonra buradaki herkes bu şekilde çalışır

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

Hazırda bekletme 4.3 aşağıdaki yerine

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

-1

Sadece aşağıdaki paketi içe aktarın,

import org.hibernate.cfg.Configuration;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.