当我将Hibernate版本从3.6.8更新到4.0.0时,我在这一行中得到了关于已弃用方法buildSessionFactory()的警告:
private static final SessionFactory sessionFactory =
new Configuration().configure().buildSessionFactory();
Javadoc建议使用另一种方法
buildSessionFactory (ServiceRegistry ServiceRegistry)
但在文档中我发现了弃用的变体
是的,它被弃用了。http://docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/cfg/Configuration.html#buildSessionFactory()特别告诉您使用您找到的另一个方法(buildSessionFactory(ServiceRegistry ServiceRegistry))—因此使用它。
文档从一个版本复制到另一个版本,可能只是还没有更新(他们不会在每个版本都重写手册)——所以请相信Javadocs。
有关更改的详情,请参阅以下网址:
源代码:https://github.com/hibernate/hibernate-core/commit/0b10334e403cf2b11ee60725cc5619eaafecc00b
门票:https://hibernate.onjira.com/browse/hhh - 5991
其他参考资料:
http://relation.to/Bloggers/HibernateCore40IsFinal
http://relation.to/19942.lace
http://docs.jboss.org/hibernate/core/4.0/devguide/en-US/html/ch07.html#services-registry
http://sourceforge.net/apps/mediawiki/hibernate/index.php?title=Category:Services
是的,它被弃用了。用下面的代码替换你的SessionFactory:
在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;
}
更新:
在Hibernate 4.3中,ServiceRegistryBuilder已弃用。请使用以下语句。
serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
configuration.getProperties()).build();
我编辑了上面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);
这里有很多hibernate核心框架中已弃用的api。
我们已经创建了会话工厂,如下所示:
SessionFactory SessionFactory = new Configuration().configure(). buildessionfactory ();
方法buildSessionFactory在hibernate 4发行版中已弃用,并被新的API所取代。如果你使用hibernate 4.3.0及以上版本,你的代码必须是:
配置Configuration = new Configuration().configure();
StandardServiceRegistryBuilder生成器= new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
SessionFactory factory = configuration.buildSessionFactory(builder.build());
从4.3.0开始,类ServiceRegistryBuilder被StandardServiceRegistryBuilder取代。看起来在5.0版本中会有很多变化。但是,对于已弃用的api和适合使用的替代方案仍然没有太多的明确说明。每一个增量版本都会出现更多弃用的API,它们都是为了5.0版本的核心框架进行微调。
博士TL;
是的,它是。有更好的方法引导Hibernate,比如下面的方法。
Hibernate-native引导
传统的Configuration对象不如使用BootstrapServiceRegistryBuilder强大,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 bootstrap
你也可以使用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。然而,SessionFactory扩展了EntityManagerFactory,因此构建的实际对象也是aSessionFactoryImpl’。
结论
这两个引导方法会影响Hibernate的行为。当使用本机引导时,Hibernate在遗留模式下工作,这早于JPA。
当使用JPA进行引导时,Hibernate将根据JPA规范进行操作。
这两种模式有几个不同之处:
AUTO flush模式如何在本地SQL查询中工作
实体代理是如何构建的。传统上,Hibernate在构建代理时不会触发DB,但是JPA需要抛出EntityNotFoundException异常,因此需要DB检查。
是否可以删除非纳管实体
有关这些差异的更多细节,请查看jpaccompliance类。