O método de configuração buildSessionFactory () foi descontinuado no Hibernate


215

Quando atualizei a versão do Hibernate de 3.6.8 para 4.0.0, recebi um aviso sobre o método descontinuado buildSessionFactory()nesta linha:

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

o Javadoc recomenda usar outro método

buildSessionFactory(ServiceRegistry serviceRegistry)

mas na documentação eu encontrei a variante obsoleta :(

Você pode me ajudar com esse pequeno mal-entendido?


Mesmo no guia de início rápido do 4.3.8, eles estão usando este exemplo: new Configuration () .configure (). BuildSessionFactory (); :(
Venkata Raju

@VenkataRaju Pode ser que não seja ruim, porque no Hibernate 5 tudo volta e esse exemplo está correto, mas (!) Todos os exemplos de configuração aqui não são válidos para o Hibernate 5 .
precisa saber é o seguinte

Respostas:


374

Sim, está obsoleto. Substitua seu SessionFactory pelo seguinte:

No 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;
}

ATUALIZAR:

No Hibernate 4.3, ServiceRegistryBuilder está obsoleto . Use o seguinte.

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

6
org.hibernate.service.ServiceRegistryBuilder também está obsoleto!
Accollativo

11
Sim, parece que o ServiceRegistryBuilder está obsoleto. Observando a documentação, eles sugerem o uso do StandardServiceRegistryBuilder. Então, acho que a chamada agora deve ser nova StandardRegistryBuilder (). ApplySettings (configuration.getProperties ()). Build ();
Simon B

Não consigo encontrar o StandardRegistryBuilder no hibernate 4.3. Será que ele foi alterado lá?
Dejell

7
Em vez de build (), é preciso buildServiceRegistry (), certo? Não consigo encontrar ServiceRegistry.build ().
Herbert em

43
Parece que a missão da equipe de hibernação é depreciar tudo o que eles criam.
Aug

16

Sim, está obsoleto. http://docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/cfg/Configuration.html#buildSessionFactory () especificamente diz para você usar o outro método que você encontrou ( buildSessionFactory(ServiceRegistry serviceRegistry)) - então use-o.

A documentação é copiada de uma versão para outra e provavelmente ainda não foi atualizada (eles não reescrevem o manual a cada versão) - portanto, confie nos Javadocs.

Os detalhes dessa alteração podem ser vistos em:

Algumas referências adicionais:


então, como fazemos sessões agora? qual é o objeto atribuído à interface serviceRegistry?
Ismail Marmoush

@IsmailMarmoush - Ainda não brinquei muito com isso, mas adicionei algumas referências adicionais.
Ziesemer

7

ou

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

    }
}

Alguns métodos descontinuados estão sendo usados ​​neste código.
precisa

6

Código verificado para funcionar no Hibernate 4.3.0. Observe que você pode remover o parâmetro XML filename ou fornecer seu próprio caminho lá. Isso é semelhante a (mas erros de digitação corrigidos) outras postagens aqui, mas esta está correta.

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

É simples assim: os documentos do JBoss não são 100% perfeitamente bem conservados. Vá com o que o JavaDoc diz : buildSessionFactory(ServiceRegistry serviceRegistry).


4

A melhor maneira de criar o objeto SessionFactory na versão mais recente do hibernate 4.3.0 em diante é a seguinte:

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

recebendo erro: O método buildSessionFactory () no tipo Configuration não é aplicável aos argumentos (StandardServiceRegistry)
Anju

4

Não é incomum encontrar discrepâncias entre diferentes versões da documentação. A maioria dos desenvolvedores vê a documentação como uma tarefa árdua e costuma adiar.

Como regra geral, se o javadoc diz uma coisa e alguma documentação não-javadoc a contradiz, as chances são de que o javadoc seja mais preciso. É mais provável que os programadores mantenham o javadoc atualizado com as alterações no código ... porque a "fonte" do javadoc está no mesmo arquivo que o código.

No caso de @deprecatedtags, é uma certeza virtual que o javadoc é mais preciso. Os desenvolvedores depreciam as coisas após uma cuidadosa consideração ... e (de modo geral) eles não as depreciam.


1
... e eles não os desprezam. ... a menos que seja chamado System.getenv(String) bugs.sun.com/bugdatabase/view_bug.do?bug_id=4199068
bestsss

1
Não é incomum encontrar projetos porcaria, cujos desenvolvedores preguiçosos não se preocupam em manter a documentação alinhada com o código, para que eles deixem seus usuários loucos, enquanto tentam descobrir como o lixo sangrento funciona vasculhando e esperando é algo mais do que / ** TODO: comment-me * /: - \
zakmck

@bestsss ... ou ele é chamado Configuration.buildSessionFactory();)
v.ladynev

3

Se você estiver usando o Hibernate 5.2 e superior, poderá usar o seguinte:

  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

Sim, ele é. Existem maneiras melhores de iniciar o Hibernate, como as seguintes.

Bootstrap nativo do Hibernate

O Configurationobjeto legado é menos poderoso do que usar o BootstrapServiceRegistryBuilder, introduzido desde o 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 do JPA

Você também pode inicializar o Hibernate usando o 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();

Dessa forma, você está construindo o em EntityManagerFactoryvez de um SessionFactory. No entanto, o SessionFactoryestende também o EntityManagerFactory, so the actual object that's built is aSessionFactoryImpl`.

Conclusão

Esses dois métodos de inicialização afetam o comportamento do Hibernate. Ao usar o bootstrap nativo, o Hibernate se comporta no modo legado, anterior à JPA.

Ao inicializar usando o JPA, o Hibernate se comportará de acordo com a especificação do JPA.

Existem várias diferenças entre esses dois modos:

Para mais detalhes sobre essas diferenças, consulte a JpaComplianceturma.


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' também está obsoleto.
NixRam

@NitinRam StandardServiceRegistryBuilderNÃO está obsoleto.
JPG

Muito estranho como as coisas são levadas e retiradas de depreciação no Hibernate. Costumava estar em um ponto. stackoverflow.com/questions/17911308/…
NixRam 3/15/15

0

public void sampleConnection () lança Exception {

     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

Eu editei o método criado por batbaatar acima para que ele aceite o objeto Configuration como parâmetro:

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

Na classe principal eu fiz:

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

0

No Hibernate 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

Aqui estão muitas APIs reprovadas na estrutura principal do hibernate.

criamos a fábrica de sessões como abaixo:

SessionFactory sessionFactory = nova Configuração (). Configure (). BuildSessionFactory ();

O método buildSessionFactory foi descontinuado na versão hibernate 4 e foi substituído pela nova API. Se você estiver usando o hibernate 4.3.0 e superior, seu código deverá ser:

  1. Configuração de configuração = new Configuration (). Configure ();

  2. Construtor StandardServiceRegistryBuilder = new StandardServiceRegistryBuilder (). ApplySettings (configuration.getProperties ());

  3. Fábrica SessionFactory = configuration.buildSessionFactory (builder.build ());

A classe ServiceRegistryBuilder é substituída por StandardServiceRegistryBuilder da 4.3.0. Parece que haverá muitas mudanças na versão 5.0. Ainda não há muita clareza sobre as APIs reprovadas e as alternativas adequadas para uso. Cada versão incremental apresenta uma API mais obsoleta, eles são uma maneira de ajustar a estrutura principal da versão 5.0.


0

Em hibernate 5.3.1, você pode tentar o seguinte:

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

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

SessionFactory sf = sources.buildSessionFactory();

0

Se alguém aqui depois de atualizar para a 5.1 é assim que funciona

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

em vez do abaixo no hibernate 4.3

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.