Java Hibernate中是否不推荐buildSessionFactory()配置方法
当我将Hibernate版本从3.6.8更新到4.0.0时,我收到了一条关于不推荐使用的方法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
buildSessionFactory()
的警告,这一行:
private static final SessionFactory sessionFactory =
new Configuration().configure().buildSessionFactory();
Javadoc建议使用另一种方法
buildSessionFactory(ServiceRegistry ServiceRegistry)
但在我发现的弃用变体中:(
你能帮我消除这个小小的误解吗?就这么简单:JBoss文档并没有100%得到很好的维护。继续:
buildSessionFactory(ServiceRegistry ServiceRegistry)
是的,它不推荐。()特别告诉你使用你找到的另一种方法(buildSessionFactory)(ServiceRegistry ServiceRegistry)
)-所以请使用它
文档是从一个版本复制到另一个版本的,很可能还没有更新(他们不会在每个版本都重写手册)——所以相信Javadocs
有关此更改的详细信息,请访问:
- 源代码:
- 门票:
在
@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及更高版本,则代码必须:
从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();