buildSessionFactory () เป็นวิธีการกำหนดค่าที่เลิกใช้ใน Hibernate หรือไม่


215

เมื่อฉันอัปเดตเวอร์ชันไฮเบอร์เนตจาก 3.6.8 เป็น 4.0.0 ฉันได้รับคำเตือนเกี่ยวกับวิธีเลิกใช้buildSessionFactory()ในบรรทัดนี้:

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

Javadoc แนะนำให้ใช้วิธีอื่น

buildSessionFactory(ServiceRegistry serviceRegistry)

แต่ในเอกสารฉันพบว่าตัวแปรที่ไม่สนับสนุน :(

คุณช่วยฉันด้วยความเข้าใจผิดเล็กน้อยนี้ได้ไหม?


แม้ในคู่มือเริ่มต้นใช้งานอย่างย่อ 4.3.8 พวกเขาใช้ตัวอย่างนี้: new Configuration () .configure (). buildSessionFactory (); :(
Venkata Raju

@VenkataRaju อาจจะเป็นมันก็ไม่ได้เลวร้ายเพราะใน Hibernate 5 ทุกอย่างกลับมาเปิดและตัวอย่างนี้ถูกต้อง แต่ (!) ตัวอย่างการกำหนดค่าทั้งหมดที่นี่มีความไม่ถูกต้องสำหรับ Hibernate 5
v.ladynev

คำตอบ:


374

ใช่มันเลิกใช้แล้ว แทนที่ SessionFactory ของคุณด้วยสิ่งต่อไปนี้:

ใน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;
}

UPDATE:

ในHibernate 4.3 ServiceRegistryBuilder จะเลิก ใช้สิ่งต่อไปนี้แทน

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

6
org.hibernate.service.ServiceRegistryBuilder ก็ไม่ได้ระบุไว้!
Accollativo

11
ใช่ดูเหมือนว่า ServiceRegistryBuilder ตัวเองเลิกใช้แล้วดูที่เอกสารพวกเขาแนะนำให้ใช้ StandardServiceRegistryBuilder แทน ดังนั้นฉันเดาว่าการโทรควรเป็น StandardRegistryBuilder () ใหม่ตอนนี้ ApplySettings (configuration.getProperties ()). build ();
Simon B

ฉันไม่พบ StandardRegistryBuilder ในไฮเบอร์เนต 4.3 มันเป็นไปได้ไหมว่ามันถูกเปลี่ยนไปที่นั่น?
Dejell

7
แทนที่จะเป็น build () เราต้องการ buildServiceRegistry () ใช่ไหม? ฉันหา ServiceRegistry.build () ไม่พบ
เฮอร์เบิร์ต

43
ดูเหมือนว่าภารกิจของทีมไฮเบอร์เนตที่จะคัดค้านทุกสิ่งที่พวกเขาสร้างขึ้น
3urdoch

16

ใช่มันเลิกใช้แล้ว http://docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/cfg/Configuration.html#buildSessionFactory () บอกให้คุณใช้วิธีการอื่นที่คุณพบแทน ( buildSessionFactory(ServiceRegistry serviceRegistry)) - ใช้มัน

เอกสารถูกคัดลอกมาจากรุ่นสู่รุ่นและมีแนวโน้มว่าจะยังไม่ได้รับการอัพเดต (พวกเขาไม่ได้เขียนคู่มือใหม่ทุกครั้ง) - ไว้วางใจ Javadocs

ข้อมูลเฉพาะของการเปลี่ยนแปลงนี้สามารถดูได้ที่:

ข้อมูลอ้างอิงเพิ่มเติมบางส่วน:


แล้วเราจะจัดการประชุมตอนนี้ได้อย่างไร? วัตถุที่กำหนดให้กับส่วนต่อประสานบริการ serviceRegistry คืออะไร?
Ismail Marmoush

@IsmailMarmoush - ฉันยังไม่ได้เล่นกับเรื่องนี้มากเกินไป แต่ได้เพิ่มการอ้างอิงเพิ่มเติมบางอย่าง
ziesemer

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

    }
}

มีการใช้วิธีการที่เลิกใช้แล้วในรหัสนี้
Kevin Bowersox

6

ตรวจสอบรหัสให้ทำงานใน Hibernate 4.3.0 โปรดสังเกตว่าคุณสามารถลบพารามิเตอร์ชื่อไฟล์ 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

วิธีที่ดีกว่าในการสร้างวัตถุSessionFactoryในรุ่นไฮเบอร์เนตล่าสุด4.3.0เป็นต้นไปมีดังนี้

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

ได้รับข้อผิดพลาด: วิธีการ buildSessionFactory () ในประเภทการกำหนดค่าไม่สามารถใช้กับข้อโต้แย้ง (StandardServiceRegistry)
Anju

4

ไม่ใช่เรื่องผิดปกติที่จะพบความแตกต่างระหว่างเอกสารเวอร์ชันต่าง ๆ นักพัฒนาส่วนใหญ่ดูเอกสารเป็นงานที่น่าเบื่อและพวกเขามักจะนำออก

ตามกฎทั่วไปหาก javadoc กล่าวสิ่งหนึ่งและเอกสารที่ไม่ใช่ javadoc นั้นขัดแย้งกับโอกาสที่ Javadoc นั้นมีความแม่นยำมากขึ้น โปรแกรมเมอร์มีแนวโน้มที่จะทำให้ javadoc ทันสมัยอยู่เสมอด้วยการเปลี่ยนแปลงรหัส ... เพราะ "แหล่งที่มา" สำหรับ javadoc นั้นอยู่ในไฟล์เดียวกับรหัส

ในกรณีของ@deprecatedแท็กเป็นความมั่นใจเสมือนว่า javadoc นั้นมีความแม่นยำมากขึ้น นักพัฒนาเลิกใช้สิ่งต่าง ๆ หลังจากพิจารณาอย่างถี่ถ้วนแล้ว ... และ (โดยทั่วไปจะพูด) พวกเขาจะไม่เลิกใช้งาน


1
... และพวกเขาจะไม่เลิกพวกเขา ... เว้นแต่ว่ามันจะเรียกว่าSystem.getenv(String) bugs.sun.com/bugdatabase/view_bug.do?bug_id=4199068
bestsss

1
ไม่ใช่เรื่องผิดปกติที่จะหาโครงการอึที่นักพัฒนาขี้เกียจไม่ได้กังวลเกี่ยวกับการจัดทำเอกสารที่สอดคล้องกับรหัสเพื่อให้พวกเขาขับรถผู้ใช้ของพวกเขาบ้าในขณะที่เหล่านี้พยายามที่จะหาวิธีขยะเลือดทำงานโดย เป็นสิ่งที่มากกว่า / ** สิ่งที่ต้องทำ: comment-me * /: - \
zakmck

@ bests ... หรือเรียกว่าConfiguration.buildSessionFactory();)
v.ladynev

3

หากคุณใช้Hibernate 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

TL; DR

ใช่แล้ว. มีวิธีที่ดีกว่าในการ bootstrap Hibernate เช่นวิธีต่อไปนี้

บูตสแตรปไฮเบอร์เนต

Configurationวัตถุดั้งเดิมนั้นทรงพลังน้อยกว่าการใช้งานBootstrapServiceRegistryBuilderซึ่งได้รับการแนะนำให้รู้จักตั้งแต่ 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();

JPA bootstrap

นอกจากนี้คุณยังสามารถบูตไฮเบอร์เนตโดยใช้ 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อย่างไรก็ตามการSessionFactoryขยายEntityManagerFactory, so the actual object that's built is aSessionFactoryImpl` เกินไป

ข้อสรุป

ทั้งสองวิธี bootstrapping มีผลต่อพฤติกรรมไฮเบอร์เนต เมื่อใช้ bootstrap แบบดั้งเดิม Hibernate จะทำงานในโหมดดั้งเดิมซึ่งถือกำเนิด JPA

เมื่อทำการบูตสแตรปโดยใช้ 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' เลิกใช้แล้ว
NixRam

@NitinRam StandardServiceRegistryBuilderไม่ได้รับการคัดค้าน
JPG

ค่อนข้างแปลกว่าสิ่งต่าง ๆ ถูกนำมาใช้และเลิกใช้ในไฮเบอร์เนต มันเคยเป็นจุดหนึ่ง stackoverflow.com/questions/17911308/…
NixRam

0

โมฆะสาธารณะ sampleConnection () พ่นข้อยกเว้น {

     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

ฉันแก้ไขวิธีที่สร้างโดยbatbaatar ด้านบนเพื่อให้ยอมรับวัตถุการกำหนดค่าเป็นพารามิเตอร์:

    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

นี่คือ API จำนวนมากที่เลิกใช้แล้วในเฟรมเวิร์กแกนไฮเบอร์เนต

เราได้สร้างโรงงานเซสชันดังต่อไปนี้:

SessionFactory sessionFactory = new Configuration (). configure (). buildSessionFactory ();

เมธอด buildSessionFactory เลิกใช้แล้วจากการไฮเบอร์เนต 4 และจะถูกแทนที่ด้วย API ใหม่ หากคุณใช้ไฮเบอร์เนต 4.3.0 ขึ้นไปรหัสของคุณจะต้อง:

  1. Configuration configuration = new Configuration (). configure ();

  2. StandardServiceRegistryBuilder builder = ใหม่ StandardServiceRegistryBuilder (). ApplySettings (configuration.getProperties ());

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

Class ServiceRegistryBuilder ถูกแทนที่ด้วย StandardServiceRegistryBuilder จาก 4.3.0 ดูเหมือนว่าจะมีการเปลี่ยนแปลงมากมายในรีลีส 5.0 ยังคงมีความไม่ชัดเจนมากเกี่ยวกับ API ที่เลิกใช้แล้วและทางเลือกที่เหมาะสมในการใช้ การเปิดตัวที่เพิ่มขึ้นทุกครั้งเกิดขึ้นกับ API ที่เลิกใช้มากขึ้นพวกเขากำลังปรับจูนเฟรมเวิร์กหลักสำหรับรีลีส 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.