TL; DR
그렇습니다. 다음과 같이 최대 절전 모드를 부트 스트랩하는 더 좋은 방법이 있습니다.
최대 절전 모드 부트 스트랩
레거시 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 부트 스트랩
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
수업을 확인하십시오 .