최대 절전 모드에서 buildSessionFactory () 구성 메소드가 더 이상 사용되지 않습니까?


215

Hibernate 버전을 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 2016 년

답변:


374

예, 더 이상 사용되지 않습니다. 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;
}

최신 정보:

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

최대 절전 모드 4.3에서 StandardRegistryBuilder를 찾을 수 없습니다. 거기에서 변경된 것일 수 있습니까?
Dejell

7
build () 대신 buildServiceRegistry ()가 필요합니까? ServiceRegistry.build ()를 찾을 수 없습니다.
Herbert

43
최대 절전 모드 팀의 임무는 그들이 만드는 모든 것을 더 이상 사용하지 않는 것 같습니다.
3urdoch

16

예, 더 이상 사용되지 않습니다. http://docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/cfg/Configuration.html#buildSessionFactory ()는 발견 한 다른 방법을 대신 사용하도록 지시합니다 ( buildSessionFactory(ServiceRegistry serviceRegistry)).

문서는 릴리스마다 복사되며 아직 업데이트되지 않았을 수 있습니다 (매번 릴리스마다 매뉴얼을 다시 작성하지는 않음). 따라서 Javadoc을 신뢰하십시오.

이 변경 사항에 대한 자세한 내용은 다음을 참조하십시오.

몇 가지 추가 참조 :


이제 어떻게 세션을 만들 수 있습니까? 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

JBoss 문서는 100 % 완벽하게 유지 관리되지 않습니다. JavaDoc의 말 과 함께 진행 하십시오 buildSessionFactory(ServiceRegistry serviceRegistry).


4

최신 최대 절전 모드 릴리스 4.3.0 이상 에서 SessionFactory 객체 를 생성하는 더 좋은 방법 은 다음과 같습니다.

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 December

1
게으른 개발자가 문서를 코드와 정렬하는 것에 대해 귀찮게하지 않는 쓰레기 프로젝트를 찾는 것은 드문 일이 아닙니다. / ** TODO 이상의 것 : comment-me * / :-\
zakmck

@ bestsss ... 또는라고합니다 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

그렇습니다. 다음과 같이 최대 절전 모드를 부트 스트랩하는 더 좋은 방법이 있습니다.

최대 절전 모드 부트 스트랩

레거시 Configuration객체는 BootstrapServiceRegistryBuilderHibernate 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 부트 스트랩

JPA를 사용하여 Hibernate를 부트 스트랩 할 수도 있습니다.

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있습니다. 그러나 SessionFactoryImpl도 SessionFactory확장합니다 EntityManagerFactory, so the actual object that's built is a.

결론

이 두 가지 부트 스트랩 방법은 최대 절전 모드 동작에 영향을줍니다. 기본 부트 스트랩을 사용할 때 Hibernate는 JPA 이전의 레거시 모드에서 작동합니다.

JPA를 사용하여 부트 스트랩 할 때 Hibernate는 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

Hibernate에서 더 이상 사용되지 않는 방법을 사용하는 것이 이상합니다. 그것은 한 시점에있었습니다. stackoverflow.com/questions/17911308/…
NixRam

0

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

0

위의 batbaatar에서 만든 메소드를 편집하여 Configuration 객체를 매개 변수로 허용합니다.

    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 = 새로운 구성 () .configure (). buildSessionFactory ();

buildSessionFactory 메소드는 최대 절전 모드 4에서 더 이상 사용되지 않으며 새 API로 바뀝니다. 최대 절전 모드 4.3.0 이상을 사용하는 경우 코드는 다음과 같아야합니다.

  1. 구성 구성 = new Configuration (). configure ();

  2. StandardServiceRegistryBuilder 빌더 = 새 StandardServiceRegistryBuilder (). applySettings (configuration.getProperties ());

  3. SessionFactory 팩토리 = configuration.buildSessionFactory (builder.build ());

ServiceRegistryBuilder 클래스는 4.3.0에서 StandardServiceRegistryBuilder로 대체되었습니다. 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.