बिल्डसेशनफैक्टरी () कॉन्फ़िगरेशन विधि हाइबरनेट में पदावनत है


215

जब मैंने हाइबरनेट संस्करण को 3.6.8 से 4.0.0 तक अद्यतन किया, तो मुझे buildSessionFactory()इस पंक्ति में पदावनत विधि के बारे में एक चेतावनी मिली :

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

Javadoc दूसरी विधि का उपयोग करने की सलाह देता है

buildSessionFactory(ServiceRegistry serviceRegistry)

लेकिन प्रलेखन में मुझे पदावनत संस्करण मिला :(

क्या आप मेरी इस छोटी सी गलतफहमी में मदद कर सकते हैं?


4.3.8 त्वरित आरंभ गाइड में भी वे इस उदाहरण का उपयोग कर रहे हैं: नया कॉन्फ़िगरेशन () .configure ()। buildSessionFactory (); :(
वेंकट राजू

@VenkataRaju हो सकता है, यह बुरा नहीं है, क्योंकि हाइबरनेट 5 में सब कुछ वापस हो जाता है और यह उदाहरण सही है, लेकिन (!) यहाँ सभी कॉन्फ़िगरेशन उदाहरण हाइबरनेट 5 के लिए मान्य नहीं हैं ।
v.ladynev

जवाबों:


374

हां यह पदावनत है। निम्नलिखित के साथ अपना सत्रांक बदलें:

में हाइबरनेट 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;
}

अपडेट करें:

में हाइबरनेट 4.3 ServiceRegistryBuilder है पदावनत । इसके बजाय निम्नलिखित का उपयोग करें।

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

6
org.hibernate.service.ServiceRegistryBuilder भी पदावनत है!
अकोलातिवो

11
हाँ, ऐसा लगता है कि ServiceRegistryBuilder खुद ही पदावनत है, दस्तावेज़ीकरण को देखते हुए, वे इसके बजाय StandardServiceRegistryBuilder का उपयोग करने का सुझाव देते हैं। इसलिए मुझे लगता है कि कॉल अब नया होना चाहिए StandardRegistryBuilder ()। applySettings (configuration.getProperties ())। build ();
साइमन बी

मुझे हाइबरनेट में StandardRegistryBuilder नहीं मिल रहा है 4.3 क्या यह हो सकता है कि इसे वहां बदल दिया गया था?
देजेल

7
बिल्ड () के बजाय एक बिल्ड बिल्ड सेवा की आवश्यकता होती है (), सही? मुझे ServiceRegistry.build नहीं मिल रहा है ()।
हर्बर्ट

43
ऐसा लगता है कि हाइबरनेट टीम का मिशन यह है कि वे जो कुछ भी बनाते हैं, उसे पूरा करें।
3urdoch

16

हां, यह पदावनत है। http://docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/cfg/Configuration.html#buildSessionFactory () विशेष रूप से आपको इसके बजाय मिलने वाले अन्य उपयोग करने के लिए कहता है ( buildSessionFactory(ServiceRegistry serviceRegistry)) - तो इसका उपयोग करें।

दस्तावेज़ को रिलीज़ से रिलीज़ होने तक कॉपी किया जाता है, और संभवत: अभी तक अपडेट नहीं किया गया है (वे हर रिलीज़ के साथ मैनुअल को फिर से नहीं लिखते हैं) - इसलिए Javadocs पर भरोसा करें।

इस परिवर्तन की बारीकियों को यहाँ देखा जा सकता है:

कुछ अतिरिक्त संदर्भ:


तो अब हम सत्र कैसे बनाते हैं? वह कौन सी वस्तु है जो सेवा-संबंधी इंटरफ़ेस को सौंपी गई है ??
इस्माइल मरमोश

@IsmailMarmoush - मैंने अभी तक इसके साथ नहीं खेला है, लेकिन कुछ अतिरिक्त संदर्भ जोड़े हैं।
ज़ीसेमर

7

या

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

    }
}

इस कोड में कुछ पदावनत विधियों का उपयोग किया जा रहा है।
केविन बोवर्सॉक्स

6

हाइबरनेट 4.3.0 में काम करने के लिए सत्यापित कोड। ध्यान दें कि आप एक्सएमएल फ़ाइल नाम पैरामीटर को हटा सकते हैं, अन्यथा वहां अपना रास्ता प्रदान करें। यह यहाँ (लेकिन टाइपो सही) अन्य पदों के समान है, लेकिन यह सही है।

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

नवीनतम हाइबरनेट रिलीज 4.3.0 में आगे चलकर सत्रांक वस्तु बनाने का एक बेहतर तरीका इस प्रकार है :

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

त्रुटि प्राप्त करना: प्रकार कॉन्फ़िगरेशन में विधि buildSessionFactory () तर्कों (StandardServiceRegistry) के लिए लागू नहीं है
अंजू

4

प्रलेखन के विभिन्न संस्करणों के बीच विसंगतियों का पता लगाना असामान्य नहीं है। अधिकांश डेवलपर्स दस्तावेज़ीकरण को एक कोर के रूप में देखते हैं, और वे इसे बंद कर देते हैं।

अंगूठे के एक नियम के रूप में, अगर javadoc एक बात कहता है और कुछ गैर-javadoc दस्तावेज़ीकरण इसका विरोध करता है, तो संभावना है कि javadoc अधिक सटीक है। प्रोग्रामर को कोड में बदलाव करने के लिए javadoc को रखने की अधिक संभावना है ... क्योंकि javadoc के लिए "स्रोत" कोड के समान फ़ाइल में है।

@deprecatedटैग के मामले में , यह एक आभासी निश्चितता है कि javadoc अधिक सटीक है। डेवलपर्स सावधानीपूर्वक विचार के बाद चीजों को चित्रित करते हैं ... और (आम तौर पर बोलते हुए) वे उन्हें अनदेखा नहीं करते हैं।


1
... और वे उन्हें अनदेखा नहीं करते। ... जब तक इसे System.getenv(String) Bugs.sun.com/bugdatabase/view_bug.do?bug_id=4199068 नहीं
3

1
यह बकवास परियोजनाओं को खोजने के लिए असामान्य नहीं है, जिनके आलसी डेवलपर्स प्रलेखन को कोड के साथ संरेखित करने के बारे में परेशान नहीं करते हैं, ताकि वे अपने उपयोगकर्ताओं को पागल कर दें, जबकि ये पता लगाने की कोशिश करते हैं कि खूनी बकवास अपने आप में कैसे काम करता है और उम्मीद करता है / TODO से अधिक कुछ है:
टिप्पणी-

@bestsss ... या इसे कहा जाता है Configuration.buildSessionFactory();)
v.ladynev

3

यदि आप हाइबरनेट 5.2 और इसके बाद के संस्करण का उपयोग कर रहे हैं तो आप इसका उपयोग कर सकते हैं:

  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

टी एल; डॉ

हाँ यही है। निम्नलिखित की तरह, हाइबरनेट को बूट करने के बेहतर तरीके हैं।

हाइबरनेट-देशी बूटस्ट्रैप

लेबर Configurationऑब्जेक्ट का उपयोग करने की तुलना में कम शक्तिशाली है BootstrapServiceRegistryBuilder, हाइबरनेट 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();

जेपीए बूटस्ट्रैप

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

इस तरह, आप EntityManagerFactoryएक के बजाय निर्माण कर रहे हैं SessionFactory। हालाँकि, SessionFactoryImpl` को भी SessionFactoryबढ़ाता EntityManagerFactory, so the actual object that's built is aहै।

निष्कर्ष

ये दो बूटस्ट्रैपिंग तरीके हाइबरनेट व्यवहार को प्रभावित करते हैं। देशी बूटस्ट्रैप का उपयोग करते समय, हाइबरनेट विरासत मोड में व्यवहार करता है, जो जेपीए से पहले होता है।

जब JPA का उपयोग कर बूटस्ट्रैपिंग की जाती है, तो हाइबरनेट JPA विनिर्देश के अनुसार व्यवहार करेगा।

इन दो तरीकों के बीच कई अंतर हैं:

इन अंतरों के बारे में अधिक जानकारी के लिए, JpaComplianceकक्षा देखें।


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' भी पदावनत है।
निक्सनराम

@ नितिनराम StandardServiceRegistryBuilderको पदावनत नहीं किया गया है।
JPG

काफी अजीब है कि हाइबरनेट में चीजों को किस तरह से लिया जाता है। यह एक बिंदु पर हुआ करता था। stackoverflow.com/questions/17911308/…
NixRam

0

सार्वजनिक शून्य का नमूनाकरण () अपवाद {

     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

मैंने ऊपर बैटबैटर द्वारा बनाई गई विधि को संपादित किया ताकि यह एक पैरामीटर के रूप में कॉन्फ़िगरेशन ऑब्जेक्ट को स्वीकार करे:

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

मुख्य वर्ग में मैंने किया:

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

0

में हाइबरनेट 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

यहां कई एपीआई हाइबरनेट कोर ढांचे में पदावनत हैं।

हमने नीचे के रूप में सत्र कारखाना बनाया है:

SessionFactory sessionFactory = नया विन्यास ()। Config ()। BuildSessionFactory ();

विधि buildSessionFactory हाइबरनेट 4 रिलीज से हटा दिया गया है और इसे नए एपीआई के साथ बदल दिया गया है। यदि आप हाइबरनेट 4.3.0 और इसके बाद के संस्करण का उपयोग कर रहे हैं, तो आपका कोड होना चाहिए:

  1. कॉन्फ़िगरेशन कॉन्फ़िगरेशन = नया कॉन्फ़िगरेशन ()। कॉन्फ़िगर ();

  2. StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder ()। applySettings (configuration.getProperties ());

  3. SessionFactory कारखाना = configuration.buildSessionFactory (build..build ());

Class ServiceRegistryBuilder को 4.3.0 से StandardServiceRegistryBuilder द्वारा बदल दिया गया है। ऐसा लग रहा है कि 5.0 रिलीज में कई बदलाव होंगे। अभी भी हटाए गए एपीआई और उपयोग करने के लिए उपयुक्त विकल्पों पर बहुत स्पष्टता नहीं है। प्रत्येक वृद्धिशील रिलीज़ अधिक पदावनत एपीआई के साथ आता है, वे रिलीज़ 5.0 के लिए कोर ढांचे को ठीक करने के तरीके में हैं।


0

में hibernate 5.3.1, आप यह कोशिश कर सकते हैं:

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

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

SessionFactory sf = sources.buildSessionFactory();

0

अगर किसी को भी 5.1 अद्यतन करने के बाद यहाँ यह कैसे काम करता है

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

हाइबरनेट 4.3 में नीचे के बजाय

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.