Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate中是否不推荐buildSessionFactory()配置方法_Java_Hibernate_Configuration_Deprecated_Bootstrapping - Fatal编程技术网

Java Hibernate中是否不推荐buildSessionFactory()配置方法

Java Hibernate中是否不推荐buildSessionFactory()配置方法,java,hibernate,configuration,deprecated,bootstrapping,Java,Hibernate,Configuration,Deprecated,Bootstrapping,当我将Hibernate版本从3.6.8更新到4.0.0时,我收到了一条关于不推荐使用的方法buildSessionFactory()的警告,这一行: private static final SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); Javadoc建议使用另一种方法 buildSessionFactory(ServiceRegistry Ser

当我将Hibernate版本从3.6.8更新到4.0.0时,我收到了一条关于不推荐使用的方法
buildSessionFactory()
的警告,这一行:

private static final SessionFactory sessionFactory =
         new Configuration().configure().buildSessionFactory();
Javadoc建议使用另一种方法

buildSessionFactory(ServiceRegistry ServiceRegistry)

但在我发现的弃用变体中:(


你能帮我消除这个小小的误解吗?

就这么简单:JBoss文档并没有100%得到很好的维护。继续:
buildSessionFactory(ServiceRegistry ServiceRegistry)
是的,它不推荐。()特别告诉你使用你找到的另一种方法(
buildSessionFactory)(ServiceRegistry ServiceRegistry)
)-所以请使用它

文档是从一个版本复制到另一个版本的,很可能还没有更新(他们不会在每个版本都重写手册)——所以相信Javadocs

有关此更改的详细信息,请访问:

  • 源代码:
  • 门票:
其他一些参考资料:


在不同版本的文档之间发现差异并不罕见。大多数开发人员将文档视为一件琐事,他们倾向于推迟

根据经验,如果javadoc说了一件事,而一些非javadoc文档与之相矛盾,那么javadoc很有可能更准确。程序员更有可能通过对代码的更改使javadoc保持最新……因为javadoc的“源”与代码在同一个文件中


@deprecated
标记的情况下,javadoc的准确性几乎是确定无疑的。开发人员在仔细考虑后不赞成使用这些标记……而且(一般来说)他们不会取消这些标记。

是的,它不赞成使用。用以下内容替换SessionFactory:

休眠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;
}
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();

    }
}
更新:

在Hibernate 4.3中,ServiceRegistryBuilder已被弃用

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


验证代码在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);

public void 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.");
}

我编辑了由创建的方法,因此它接受配置对象作为参数:

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

只需导入以下包

import org.hibernate.cfg.Configuration;

休眠4.2.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;
}
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();

    }
}

下面是许多在hibernate核心框架中不推荐使用的API

我们创建了会话工厂,如下所示:

SessionFactory SessionFactory=新配置().configure().buildSessionFactory()

hibernate 4版本中不推荐使用buildSessionFactory方法,并将其替换为新的API。如果您使用的是hibernate 4.3.0及更高版本,则代码必须:

  • 配置=新配置().configure()

  • StandardServiceRegistryBuilder=新的StandardServiceRegistryBuilder().applySettings(configuration.getProperties())

  • SessionFactory=configuration.buildSessionFactory(builder.build())


  • 从4.3.0开始,ServiceRegistryBuilder类被StandardServiceRegistryBuilder取代。5.0版本中似乎会有很多变化。但不推荐使用的API和合适的替代品仍然不太清楚。每个增量版本都会出现更多不推荐使用的API,它们正在微调核心f版本5.0的框架。

    在最新的hibernate版本4.3.0中创建SessionFactory对象的更好方法如下:

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

    如果您使用的是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);
        }
      }
    

    hibernate 5.3.1
    中,您可以尝试以下操作:

    ServiceRegistry standardRegistry = 
                    new StandardServiceRegistryBuilder().configure().build();
    
    Metadata sources = new MetadataSources(standardRegistry).addAnnotatedClass(MyEntity.class).getMetadataBuilder().build();
    
    SessionFactory sf = sources.buildSessionFactory();
    

    如果有人在更新到5.1后来到这里,这就是它的工作原理

    StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
                    MetadataSources sources = new MetadataSources(registry);
                    Metadata metadata = sources.getMetadataBuilder().build();
                    sessionFactory = metadata.getSessionFactoryBuilder().build();
    
    而不是hibernate 4.3中的以下内容

     ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(
                configuration.getProperties()). buildServiceRegistry();
        sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    
    太长,读不下去了 是的,它是。有更好的方法引导休眠,如下面的方法

    Hibernate本机引导 传统的
    配置
    对象不如使用自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();
    
    通过这种方式,您正在构建
    EntityManagerFactory
    而不是
    SessionFactory
    。然而,
    SessionFactory
    扩展了
    EntityManagerFactory,因此实际构建的对象也是一个
    SessionFactoryImpl`

    结论 这两种引导方法会影响Hibernate的行为。当使用本机引导时,Hibernate的行为是在JPA之前的遗留模式下进行的

    当使用JPA引导时,Hibernate将按照JPA规范进行操作

    这两种模式之间存在一些差异:

    • 实体代理是如何构建的。传统上,Hibernate在构建代理时不会触及数据库,但JPA要求抛出
      EntityNotFoundException
      ,因此要求进行数据库检查
    • 是否可以删除非托管实体
    有关这些差异的更多详细信息,请查看课程


    那么,我们现在如何创建会话呢?分配给serviceRegistry接口的对象是什么???@IsmailMarmoush-我还没有过多地使用它,但添加了一些额外的引用…它们不会取消对它们的预测…除非它被称为
    System.getenv(String)
    发现垃圾项目并不罕见,这些项目的懒惰开发人员懒得让文档与代码保持一致,因此他们会让用户发疯,而这些项目则试图通过翻找自身并希望有比/**TODO更多的东西来找出这些该死的垃圾是如何工作的:评论我*/
    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();