হাইবারনেটে বিল্ডসেশনফ্যাক্টরি () কনফিগারেশন পদ্ধতিটি অবচিত হয়েছে


215

আমি যখন হাইবারনেট সংস্করণটি ৩.6.৮ থেকে ৩.০.০ এ আপডেট করেছি, তখন আমি buildSessionFactory()এই লাইনে অবচয় পদ্ধতি সম্পর্কে একটি সতর্কতা পেয়েছি :

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

জাভাডোক অন্য পদ্ধতি ব্যবহার করার পরামর্শ দেয়

buildSessionFactory(ServiceRegistry serviceRegistry)

তবে ডকুমেন্টেশনে আমি হ্রাসপ্রাপ্ত রূপটি পেয়েছি :(

এই সামান্য ভুল বোঝাবুঝি আপনি আমাকে সাহায্য করতে পারেন?


এমনকি ৪.৩.৮ কুইক স্টার্ট গাইডে তারা এই উদাহরণটি ব্যবহার করছে: নতুন কনফিগারেশন () .কনফিগার ()। বিল্ডসেশনফ্যাক্টরি (); :(
ভেঙ্কটা রাজু

@ ভেনকাটারাজু হতে পারে, এটি খারাপ নয়, কারণ হাইবারনেট ৫-এ সমস্ত কিছু ফিরে আসে এবং এই উদাহরণটি সঠিক, তবে (!) সমস্ত কনফিগারেশন উদাহরণ হাইবারনেট 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.S सर्विसআরেজিস্ট্রি বিল্ডারকেও ছাড় দেওয়া হয়!
একল্লাটিভো

11
হ্যাঁ, মনে হচ্ছে সার্ভিসজিস্টি বিল্ডার নিজেই অবহেলিত, ডকুমেন্টেশনটি দেখে তারা পরিবর্তে স্ট্যান্ডার্ড সার্ভিসরেজিস্ট্রি বিল্ডার ব্যবহার করার পরামর্শ দেয়। সুতরাং আমার ধারণা কলটি এখন নতুন স্ট্যান্ডার্ডরেজিস্ট্রি বিল্ডার () হওয়া উচিত apply প্রয়োগসেটিংস (কনফিগারেশন.জেটপ্রেটিস ()) বিল্ড ();
সাইমন বি

হাইবারনেট ৪.৩-তে আমি স্ট্যান্ডার্ডরেজিস্ট্রি বিল্ডারটি খুঁজে পাচ্ছি না এটি কি সেখানে পরিবর্তন করা যেতে পারে?
দেজেল

7
বিল্ড () এর পরিবর্তে একজনের বিল্ড সার্ভিসরেজিস্ট্রি () দরকার, তাই না? আমি সার্ভিসজিস্ট্রি.বিল্ড () খুঁজে পাচ্ছি না।
হারবার্ট

43
মনে হচ্ছে হাইবারনেট টিমের মিশন তাদের তৈরি সমস্ত কিছুকে হ্রাস করা।
3urdoch

16

হ্যাঁ, এটি অবহেলা করা হয়েছে। http://docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/cfg/Configration.html#buildSessionFactory () বিশেষত আপনাকে পরিবর্তিত অন্য পদ্ধতিটি ব্যবহার করতে বলেছে (buildSessionFactory(ServiceRegistry serviceRegistry) ) - সুতরাং এটি ব্যবহার করুন।

দস্তাবেজটি প্রকাশ থেকে প্রকাশের জন্য অনুলিপি করা হয়েছে, এবং সম্ভবত এখনও আপডেট হয়নি (তারা প্রতিটি রিলিজের সাথে ম্যানুয়ালটি পুনরায় লেখেন না) - তাই জাভাদোকগুলিকে বিশ্বাস করুন।

এই পরিবর্তনের সুনির্দিষ্ট বিষয়গুলি এখানে দেখা যাবে:

কিছু অতিরিক্ত রেফারেন্স:


তাহলে এখন আমরা কীভাবে সেশন করব? সার্ভিস রেজিস্ট্রি ইন্টারফেসের জন্য নির্ধারিত অবজেক্টটি কী ??
ইসমাইল মারমৌশ

@ ইসমাইলমারমৌশ - আমি এটি নিয়ে খুব বেশি খেলিনি, তবে কিছু অতিরিক্ত রেফারেন্স যুক্ত করেছি।
জিজিমার

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

হাইবারনেট ৪.৩.০ এ কাজ করার জন্য কোড যাচাই করা হয়েছে। লক্ষ্য করুন আপনি XML ফাইল নাম পরামিতি অপসারণ করতে পারেন, বা অন্যথায় সেখানে নিজের পথ সরবরাহ করতে পারেন। এটি এখানে অন্যান্য পোস্টের মতো (তবে টাইপস সংশোধন করা হয়েছে) তবে এটি সঠিক।

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

সর্বশেষ হাইবারনেট রিলিজ ৪.৩.০ এ সেশনফ্যাক্টরি অবজেক্ট তৈরি করার একটি আরও ভাল উপায় নিম্নরূপ :

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

ত্রুটি পাচ্ছে: কনফিগারেশন টাইপ পদ্ধতিতে বিল্ডসেশনফ্যাক্ট্রি () আর্গুমেন্টগুলির জন্য প্রযোজ্য নয় (স্ট্যান্ডার্ড সার্ভিস রিজিস্ট্রি)
অঞ্জু

4

ডকুমেন্টেশনের বিভিন্ন সংস্করণের মধ্যে তফাত খুঁজে পাওয়া অস্বাভাবিক নয়। বেশিরভাগ বিকাশকারী ডকুমেন্টেশনকে নৃত্যবিরোধী হিসাবে দেখেন এবং তারা এটি বন্ধ করে দেওয়ার প্রবণতা রাখেন।

থাম্বের নিয়ম হিসাবে, জাভাডোক যদি একটি জিনিস বলে এবং কিছু জাভাদোক নথিপত্র এটির বিপরীতে থাকে, তবে জাভাদোকটি আরও সঠিক হওয়ার সম্ভাবনা রয়েছে। প্রোগ্রামাররা কোড পরিবর্তন করার সাথে সাথে জাভাদোকটিকে আপ টু ডেট রাখার সম্ভাবনা বেশি ... কারণ জাভাদোকের "উত্স" কোডের মতো একই ফাইলে রয়েছে।

@deprecatedট্যাগগুলির ক্ষেত্রে , এটি ভার্চুয়াল নিশ্চিত যে জাভাদোকটি আরও সঠিক। বিকাশকারীরা সাবধানতার সাথে বিবেচনা করার পরে জিনিসগুলি হ্রাস করে ... এবং (সাধারণভাবে বলা হয়) তারা সেগুলি অবমূল্যায়ন করে না।


1
... এবং তারা তাদের অবমূল্যায়ন করে না। ... যতক্ষণ না System.getenv(String) এগুলিকে
বেটসেস

1
ক্রেপ প্রকল্পগুলি খুঁজে পাওয়া অস্বাভাবিক নয়, যার অলস বিকাশকারীরা কোডটির সাথে ডকুমেন্টেশনটি একত্রে রাখার বিষয়ে মাথা ঘামায় না, যাতে তারা তাদের ব্যবহারকারীদের পাগল করে তোলে, এইগুলি রক্তাক্ত আবর্জনা কীভাবে নিজের মধ্যে গুজব ছড়িয়ে কাজ করে এবং সেখানে আশা করে তা নির্ধারণ করার চেষ্টা করে
টোডো

@ বেস্টেস ... বা এটি বলা হয় 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();

জেপিএ বুটস্ট্র্যাপ

আপনি জেপিএ ব্যবহার করে হাইবারনেট বুটস্ট্র্যাপ করতে পারেন:

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। যাইহোক, SessionFactoryপ্রসারিত EntityManagerFactory, so the actual object that's built is aSessionFactoryImpl` খুব।

উপসংহার

এই দুটি বুটস্ট্র্যাপিং পদ্ধতি হাইবারনেট আচরণকে প্রভাবিত করে। নেটিভ বুটস্ট্র্যাপ ব্যবহার করার সময়, হাইবারনেট লিগ্যাসি মোডে আচরণ করে, যা জেপিএর পূর্বাভাস দেয়।

জেপিএ ব্যবহার করে বুটস্ট্র্যাপিং করার সময়, হাইবারনেট জেপিএ স্পেসিফিকেশন অনুযায়ী আচরণ করবে।

এই দুটি পদ্ধতির মধ্যে বেশ কয়েকটি পার্থক্য রয়েছে:

এই পার্থক্য সম্পর্কে আরও তথ্যের জন্য, 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নয়।
জেপিজি

হাইবারনেটে কীভাবে জিনিসগুলি অব্যাহত রাখা হয় এবং বন্ধ করা হয় তা বেশ বিস্ময়কর। এটি এক পর্যায়ে থাকত। 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

হাইবারনেট কোর ফ্রেমওয়ার্কে হ'ল এখানে অনেকগুলি এপিআই রয়েছে।

আমরা নীচের মত সেশন কারখানা তৈরি করেছি:

সেশনফ্যাক্টরি সেশনফ্যাক্টরি = নতুন কনফিগারেশন ()। কনফিগার ()। বিল্ডসেশনফ্যাক্টরি ();

মেথড বিল্ডসেশনফ্যাক্টরী হাইবারনেট 4 রিলিজ থেকে হ্রাস করা হয়েছে এবং এটি নতুন এপিআই দ্বারা প্রতিস্থাপিত হয়েছে। আপনি যদি হাইবারনেট ৪.৩.০ এবং তার বেশি ব্যবহার করে থাকেন তবে আপনার কোডটি হতে হবে:

  1. কনফিগারেশন কনফিগারেশন = নতুন কনফিগারেশন ()। কনফিগার ();

  2. স্ট্যান্ডার্ড সার্ভিসরেজিস্ট্রি বিল্ডার বিল্ডার = নতুন স্ট্যান্ডার্ড সার্ভিসরেজিস্ট্রি বিল্ডার ()। অ্যাপ্লিকেশনসেটিংস (কনফিগারেশন.জেটপ্রোপার্টি ());

  3. সেশনফ্যাক্টরি কারখানা = কনফিগারেশন.বিল্ডসেশনফ্যাক্টরি (বিল্ডার.বিল্ড ());

ক্লাস সার্ভিসরেজিস্ট্রি বিল্ডার 4.3.0 থেকে স্ট্যান্ডার্ড সার্ভিসরেজিস্ট্রি বিল্ডার দ্বারা প্রতিস্থাপিত হয়। দেখে মনে হচ্ছে 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);

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.