Apakah metode konfigurasi buildSessionFactory () tidak digunakan lagi di Hibernate


215

Ketika saya memperbarui versi Hibernate dari 3.6.8 ke 4.0.0, saya mendapat peringatan tentang metode usang buildSessionFactory()di baris ini:

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

Javadoc merekomendasikan menggunakan metode lain

buildSessionFactory(ServiceRegistry serviceRegistry)

tetapi dalam dokumentasi saya menemukan varian usang :(

Bisakah Anda membantu saya dengan kesalahpahaman kecil ini?


Bahkan dalam 4.3.8 panduan mulai cepat mereka menggunakan contoh ini: Konfigurasi baru () .configure (). BuildSessionFactory (); :(
Venkata Raju

@VenkataRaju Mungkin, itu tidak buruk, karena di Hibernate 5 semuanya kembali dan contoh ini benar, tetapi (!) Semua contoh konfigurasi di sini tidak valid untuk Hibernate 5 .
v.ladynev

Jawaban:


374

Ya itu sudah usang. Ganti SessionFactory Anda dengan yang berikut:

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

MEMPERBARUI:

Di Hibernate 4.3 ServiceRegistryBuilder sudah usang . Gunakan yang berikut ini sebagai gantinya.

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

6
org.hibernate.service.ServiceRegistryBuilder juga rusak!
Accollativo

11
Ya, sepertinya ServiceRegistryBuilder sendiri sudah usang, melihat dokumentasi, mereka menyarankan menggunakan StandardServiceRegistryBuilder sebagai gantinya. Jadi saya kira panggilan sekarang harus menjadi StandardRegistryBuilder (). ApplySettings baru (configuration.getProperties ()). Build ();
Simon B

Saya tidak dapat menemukan StandardRegistryBuilder di hibernate 4.3 mungkinkah itu diubah di sana?
Dejell

7
Alih-alih build () kita perlu buildServiceRegistry (), kan? Saya tidak dapat menemukan ServiceRegistry.build ().
Herbert

43
Tampaknya itu adalah misi dari tim hibernate untuk mencela semua yang mereka buat.
3urdoch

16

Ya, itu sudah usang. http://docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/cfg/Configuration.html#buildSessionFactory () secara khusus memberitahu Anda untuk menggunakan metode lain yang Anda temukan ( buildSessionFactory(ServiceRegistry serviceRegistry)) - jadi gunakan saja.

Dokumentasi disalin dari rilis ke rilis, dan kemungkinan belum diperbarui (mereka tidak menulis ulang manual dengan setiap rilis) - jadi percayalah pada Javadocs.

Spesifikasi perubahan ini dapat dilihat di:

Beberapa referensi tambahan:


jadi bagaimana kita membuat sesi sekarang? apa objek yang ditugaskan untuk antarmuka serviceRegistry ??
Ismail Marmoush

@IsmailMarmoush - Saya belum terlalu banyak bermain dengan ini, tetapi telah menambahkan beberapa referensi tambahan.
ziesemer

7

atau

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

    }
}

Beberapa metode usang digunakan dalam kode ini.
Kevin Bowersox

6

Kode diverifikasi untuk berfungsi di Hibernate 4.3.0. Perhatikan Anda dapat menghapus parameter nama file XML, atau berikan path Anda sendiri di sana. Ini mirip dengan (tetapi kesalahan ketik dikoreksi) posting lain di sini, tetapi yang ini benar

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

Cara yang lebih baik untuk membuat objek SessionFactory di rilis hibernasi terbaru 4.3.0 dan seterusnya adalah sebagai berikut:

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

mendapatkan kesalahan: Metode buildSessionFactory () dalam tipe Konfigurasi tidak berlaku untuk argumen (StandardServiceRegistry)
Anju

4

Sudah lazim menemukan perbedaan antara berbagai versi dokumentasi. Sebagian besar pengembang melihat dokumentasi sebagai tugas, dan mereka cenderung menundanya.

Sebagai patokan, jika javadoc mengatakan satu hal dan beberapa dokumentasi non-javadoc membantahnya, kemungkinan javadoc lebih akurat. Programmer lebih cenderung memperbarui javadoc dengan perubahan kode ... karena "sumber" untuk javadoc berada dalam file yang sama dengan kode.

Dalam hal @deprecatedtag, adalah kepastian virtual bahwa javadoc lebih akurat. Pengembang mencela hal-hal setelah pertimbangan yang cermat ... dan (secara umum) mereka tidak mengabaikannya.


1
... dan mereka tidak mengecewakan mereka. ... kecuali itu disebut System.getenv(String) bugs.sun.com/bugdatabase/view_bug.do?bug_id=4199068
bestsss

1
Bukan hal yang aneh untuk menemukan proyek sampah, yang pengembang malasnya tidak repot-repot menjaga agar dokumen tetap selaras dengan kode, sehingga mereka membuat penggunanya gila, sementara ini mencoba mencari tahu bagaimana sampah yang berdarah bekerja dengan mengobrak-abrik sendiri dan berharap ada adalah sesuatu yang lebih dari / ** TODO: comment-me * /: - \
zakmck

@bestsss ... atau itu disebut Configuration.buildSessionFactory();)
v.ladynev

3

Jika Anda menggunakan Hibernate 5.2 dan di atasnya maka Anda dapat menggunakan ini:

  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

Ya itu. Ada beberapa cara yang lebih baik untuk melakukan bootstrap Hibernate, seperti yang berikut ini.

Bootstrap asli-hibernasi

ConfigurationObjek warisan kurang kuat daripada menggunakan BootstrapServiceRegistryBuilder, diperkenalkan sejak 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

Anda juga dapat melakukan bootstrap Hibernate menggunakan 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();

Dengan cara ini, Anda sedang membangun EntityManagerFactorybukan SessionFactory. Namun, SessionFactorymemperpanjangEntityManagerFactory, so the actual object that's built is a SessionFactoryImpl` juga.

Kesimpulan

Dua metode bootstrap ini memengaruhi perilaku Hibernate. Saat menggunakan bootstrap asli, Hibernate berperilaku dalam mode lama, yang ada sebelum JPA.

Saat bootstrap menggunakan JPA, Hibernate akan berperilaku sesuai dengan spesifikasi JPA.

Ada beberapa perbedaan antara kedua mode ini:

  • Bagaimana mode siram AUTO bekerja dalam hal permintaan SQL asli
  • Bagaimana entitas Proxy dibangun. Secara tradisional, Hibernate tidak menekan DB ketika membangun Proxy, tetapi JPA membutuhkan melemparkanEntityNotFoundException , oleh karena itu menuntut pemeriksaan DB.
  • apakah Anda dapat menghapus entitas yang tidak dikelola

Untuk detail lebih lanjut tentang perbedaan-perbedaan ini, periksa JpaCompliancekelas.


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' juga sudah usang.
NixRam

@NitinRam StandardServiceRegistryBuilderTIDAK ditinggalkan.
JPG

Cukup aneh bagaimana hal-hal yang diambil dan dimatikan depresiasi di Hibernate. Dulu pada satu titik. stackoverflow.com/questions/17911308/…
NixRam

0

public void sampleConnection () melempar Pengecualian {

     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

Saya mengedit metode yang dibuat oleh batbaatar di atas sehingga ia menerima objek Konfigurasi sebagai parameter:

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

Di kelas utama saya lakukan:

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

0

Di 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

di sini ada banyak API yang tidak digunakan lagi dalam kerangka kerja hibernate.

kami telah membuat pabrik sesi seperti di bawah ini:

SessionFactory sessionFactory = Konfigurasi baru (). Configure (). BuildSessionFactory ();

Metode buildSessionFactory sudah usang dari rilis hibernate 4 dan diganti dengan API baru. Jika Anda menggunakan hibernate 4.3.0 ke atas, kode Anda harus:

  1. Konfigurasi konfigurasi = Konfigurasi baru (). Configure ();

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

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

Kelas ServiceRegistryBuilder digantikan oleh StandardServiceRegistryBuilder dari 4.3.0. Sepertinya akan ada banyak perubahan pada rilis 5.0. Masih tidak ada banyak kejelasan tentang API yang sudah usang dan alternatif yang cocok untuk digunakan. Setiap rilis tambahan hadir dengan API yang lebih usang, mereka sedang dalam rangka menyempurnakan kerangka inti untuk rilis 5.0.


0

Di hibernate 5.3.1, Anda dapat mencoba ini:

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

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

SessionFactory sf = sources.buildSessionFactory();

0

Jika ada orang di sini setelah memperbarui ke 5.1 ini adalah cara kerjanya

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

bukannya di bawah ini dalam hibernasi 4.3

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.