Phương thức cấu hình buildSessionFactory () không được dùng trong Hibernate


215

Khi tôi cập nhật phiên bản Hibernate từ 3.6.8 lên 4.0.0, tôi đã nhận được cảnh báo về phương pháp không dùng nữa buildSessionFactory()trong dòng này:

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

Javadoc khuyến nghị sử dụng phương thức khác

buildSessionFactory(ServiceRegistry serviceRegistry)

nhưng trong tài liệu tôi thấy biến thể không dùng nữa :(

Bạn có thể giúp tôi với sự hiểu lầm nhỏ này?


Ngay cả trong hướng dẫn khởi động nhanh 4.3.8, họ vẫn đang sử dụng ví dụ này: new Cấu hình () .configure (). BuildSessionFactory (); :(
Venkata Raju

@VenkataRaju Có thể, nó không tệ, vì trong Hibernate 5 mọi thứ đều quay lại và ví dụ này đúng, nhưng (!) Tất cả các ví dụ cấu hình ở đây không hợp lệ cho Hibernate 5 .
v.ladynev

Câu trả lời:


374

Có nó bị phản đối. Thay thế SessionFactory của bạn bằng cách sau:

Trong chế độ ngủ đông 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;
}

CẬP NHẬT:

Trong Hibernate 4.3 ServiceRegistryBuilder không được dùng nữa . Sử dụng như sau để thay thế.

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

6
org.hibernate.service.ServiceRegistryBuilder cũng bị tước quyền!
Accollativo

11
Vâng, có vẻ như ServiceRegistryBuilder không được dùng nữa, nhìn vào tài liệu, họ đề nghị sử dụng StandardServiceRegistryBuilder để thay thế. Vì vậy, tôi đoán rằng cuộc gọi bây giờ sẽ là StandardRegistryBuilder () mới. Áp dụng Cài đặt (configure.getProperIES ()). Build ();
Simon B

Tôi không thể tìm thấy StandardRegistryBuilder trong chế độ ngủ đông 4.3 có thể là nó đã được thay đổi ở đó không?
Dejell

7
Thay vì build () người ta cần buildServiceRegistry (), phải không? Tôi không thể tìm thấy ServiceRegistry.build ().
Herbert

43
Có vẻ như nhiệm vụ của đội ngủ đông là loại bỏ mọi thứ họ tạo ra.
3urdoch

16

Vâng, nó không được chấp nhận. http://docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/cfg/Configuration.html#buildSessionFactory () đặc biệt cho bạn biết sử dụng phương thức khác mà bạn tìm thấy thay thế ( buildSessionFactory(ServiceRegistry serviceRegistry)) - vì vậy hãy sử dụng nó.

Tài liệu được sao chép từ khi phát hành đến khi phát hành và có thể chưa được cập nhật (họ không viết lại hướng dẫn sử dụng với mỗi bản phát hành) - vì vậy hãy tin tưởng vào Javadocs.

Các chi tiết cụ thể của thay đổi này có thể được xem tại:

Một số tài liệu tham khảo bổ sung:


Vậy làm thế nào để chúng ta thực hiện các phiên bây giờ? đối tượng được gán cho giao diện serviceRegistry là gì ??
Ismail Marmoush

@IsmailMarmoush - Tôi chưa chơi với điều này quá nhiều, nhưng đã thêm một số tài liệu tham khảo bổ sung.
ziesemer

7

hoặc là

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

    }
}

Một số phương pháp không dùng nữa đang được sử dụng trong mã này.
Kevin Bowersox

6

Mã được xác minh để hoạt động trong Hibernate 4.3.0. Lưu ý rằng bạn có thể xóa tham số tên tệp XML hoặc nếu không, cung cấp đường dẫn của riêng bạn ở đó. Điều này tương tự (nhưng lỗi chính tả) các bài viết khác ở đây, nhưng bài này là chính xác.

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

Nó đơn giản như thế này: các tài liệu JBoss không được duy trì hoàn hảo 100%. Đi với những gì JavaDoc nói : buildSessionFactory(ServiceRegistry serviceRegistry).


4

Một cách tốt hơn để tạo đối tượng SessionFactory trong phiên bản hibernate mới nhất 4.3.0 trở đi như sau:

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

gặp lỗi: Phương thức buildSessionFactory () trong loại Cấu hình không áp dụng cho các đối số (StandardServiceRegistry)
Anju

4

Không có gì lạ khi tìm thấy sự khác biệt giữa các phiên bản tài liệu khác nhau. Hầu hết các nhà phát triển xem tài liệu là một việc vặt, và họ có xu hướng bỏ nó đi.

Theo nguyên tắc thông thường, nếu javadoc nói một điều và một số tài liệu không phải là javadoc mâu thuẫn với nó, thì khả năng là javadoc chính xác hơn. Các lập trình viên có nhiều khả năng giữ cho javadoc được cập nhật với các thay đổi về mã ... bởi vì "nguồn" cho javadoc nằm trong cùng một tệp với mã.

Trong trường hợp các @deprecatedthẻ, một điều chắc chắn ảo rằng javadoc chính xác hơn. Các nhà phát triển không tán thành mọi thứ sau khi xem xét cẩn thận ... và (nói chung) họ không đánh giá cao chúng.


1
... và họ không đánh giá cao họ. ... trừ khi nó được gọi là System.getenv(String) bug.sun.com/bugdatabase/view_orms.do?orms_id=4199068
bestsss

1
Không có gì lạ khi tìm thấy các dự án tào lao, mà các nhà phát triển lười biếng không bận tâm đến việc giữ tài liệu phù hợp với mã, để họ khiến người dùng của họ phát điên, trong khi những người này cố gắng tìm ra cách thức hoạt động của rác rưởi bằng cách tự lục lọi là một cái gì đó nhiều hơn / ** TODO: bình luận-tôi * /: - \
zakmck

@bestsss ... hoặc nó được gọi là Configuration.buildSessionFactory();)
v.ladynev

3

Nếu bạn đang sử dụng Hibernate 5.2 trở lên thì bạn có thể sử dụng:

  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

Vâng, đúng vậy. Có nhiều cách tốt hơn để bootstrap Hibernate, như những cách sau.

Bootstrap bản địa Hibernate

ConfigurationĐối tượng kế thừa ít mạnh hơn so với sử dụng BootstrapServiceRegistryBuilder, được giới thiệu kể từ 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

Bạn cũng có thể bootstrap Hibernate bằng 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();

Bằng cách này, bạn đang xây dựng EntityManagerFactorythay vì a SessionFactory. Tuy nhiên, phần SessionFactorymở rộng EntityManagerFactory, so the actual object that's built is aSessionFactoryImpl` cũng vậy.

Phần kết luận

Hai phương thức bootstrapping này ảnh hưởng đến hành vi Hibernate. Khi sử dụng bootstrap riêng, Hibernate hoạt động ở chế độ cũ, trước JPA.

Khi bootstrapping sử dụng JPA, Hibernate sẽ hoạt động theo đặc điểm kỹ thuật của JPA.

Có một số khác biệt giữa hai chế độ này:

Để biết thêm chi tiết về những khác biệt này, hãy kiểm tra JpaCompliancelớp.


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' cũng không được dùng nữa.
NixRam

@NitinRam StandardServiceRegistryBuilderKHÔNG được phản đối.
JPG

Khá kỳ lạ về cách mọi thứ được thực hiện và không được phản đối trong Hibernate. Nó đã từng ở một điểm. stackoverflow.com/questions/17911308/
Mạnh

0

công khai void sampleConnection () ném Ngoại lệ {

     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

Tôi đã chỉnh sửa phương thức được tạo bởi batbaatar ở trên để nó chấp nhận đối tượng Cấu hình làm tham số:

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

Trong lớp học chính tôi đã làm:

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

0

Trong chế độ ngủ đông 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

có rất nhiều API không dùng trong khung lõi ngủ đông.

chúng tôi đã tạo ra nhà máy phiên như sau:

SessionFactory sessionFactory = new Cấu hình (). Configure (). BuildSessionFactory ();

Phương thức buildSessionFactory không được dùng từ bản phát hành hibernate 4 và nó được thay thế bằng API mới. Nếu bạn đang sử dụng chế độ ngủ đông 4.3.0 trở lên, mã của bạn phải là:

  1. Cấu hình cấu hình = cấu hình mới (). Configure ();

  2. Trình xây dựng StandardServiceRegistryBuilder = new StandardServiceRegistryBuilder (). ApplicationSinstall (configure.getProperIES ());

  3. Nhà máy SessionFactory = configure.buildSessionFactory (builder.build ());

Class ServiceRegistryBuilder được thay thế bởi StandardServiceRegistryBuilder từ 4.3.0. Có vẻ như sẽ có rất nhiều thay đổi trong phiên bản 5.0. Vẫn chưa có nhiều sự rõ ràng về các API không dùng nữa và các lựa chọn thay thế phù hợp để sử dụng. Mỗi bản phát hành gia tăng đều đi kèm với API không dùng nữa, chúng là cách tinh chỉnh khung cốt lõi cho bản phát hành 5.0.


0

Trong hibernate 5.3.1, bạn có thể thử điều này:

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

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

SessionFactory sf = sources.buildSessionFactory();

0

Nếu có ai ở đây sau khi cập nhật lên 5.1 thì đây là cách nó hoạt động

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

thay vì dưới đây trong chế độ ngủ đông 4.3

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.