在Hibernate 4中创build会话工厂

我在Hibernate 4中生成会话工厂时遇到了麻烦。在Hibernate 3中我简单的做了:

org.hibernate.cfg.Configuration conf= HibernateUtil .getLimsInitializedConfiguration(systemConfiguration .getHibernateconfFile()); SessionFactory sf = conf.configure().buildSessionFactory(); 

现在我需要将ServiceRegistry类传递给buildSessionFactory,但是Javadocs对于如何去做这件事非常模糊。 有小费吗?

是的,他们已经弃用了以前的buildSessionFactory API,这很容易做到。你可以做这样的事情..

编辑 :ServiceRegistryBuilder已弃用。 您必须使用StandardServiceRegistryBuilder

 public void testConnection() throws Exception { logger.info("Trying to create a test connection with the database."); Configuration configuration = new Configuration(); configuration.configure("hibernate_sp.cfg.xml"); StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()); SessionFactory sessionFactory = configuration.buildSessionFactory(ssrb.build()); Session session = sessionFactory.openSession(); logger.info("Test connection with the database created successfuly."); } 

有关更多参考资料和详细信息,可以通过https://github.com/hibernate/hibernate-orm/blob/master/hibernate-testing/src/main/java/org/hibernate/testing来查看hibernate的官方testing用例/junit4/BaseCoreFunctionalTestCase.java函数(buildSessionFactory())。;

尝试这个!

 package your.package; import org.hibernate.HibernateException; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; public class HibernateUtil { private static SessionFactory sessionFactory; private static ServiceRegistry serviceRegistry; static { try { // Configuration configuration = new Configuration(); Configuration configuration = new Configuration().configure(); serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); } catch (HibernateException he) { System.err.println("Error creating Session: " + he); throw new ExceptionInInitializerError(he); } } public static SessionFactory getSessionFactory() { return sessionFactory; } } 
 Configuration hibConfiguration = new Configuration() .addResource("wp4core/hibernate/config/table.hbm.xml") .configure(); serviceRegistry = new ServiceRegistryBuilder() .applySettings(hibConfiguration.getProperties()) .buildServiceRegistry(); sessionFactory = hibConfiguration.buildSessionFactory(serviceRegistry); session = sessionFactory.withOptions().openSession(); 

以下expression了我用hibernate 4.0.0.Final的经验。

org.hibernate.cfg.Configuration类的javadoc(在LGPL许可下分发)指出:

注意:这将被replace为使用ServiceRegistryBuilderorg.hibernate.metamodel.MetadataSources而不是在4.0版本之后,这个类将被弃用和安排在5.0中删除。 细节参见HHH-6183 , HHH-2578和HHH-6586

在看问题2578之后,我用了这样的东西:

 ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().configure().buildServiceRegistry(); MetadataSources metadataSources = new MetadataSources(serviceRegistry); metadataSources.addResource("some_mapping.hbm.xml") SessionFactory sessionFactory = metadataSources.buildMetadata().buildSessionFactory(); 

为了开始阅读configuration,我不得不修改我的hibernate 3.2.6configuration和映射文件,以使用xmlns="http://www.hibernate.org/xsd/hibernate-configuration"xmlns="http://www.hibernate.org/xsd/hibernate-mapping" ,同时也删除了dtd规范。

我无法find一种方法来检查hibernate.cfg.xml和hibernate中定义的映射 hibernate.cfg.xml中与hibernate相关的属性的前缀不再是可选的。

这可能对一些工作。

作为一个,我遇到了一些错误,因为映射文件包含<cache usage="read-write" />并以不推荐使用的configuration方式结束:

 Configuration configuration = new Configuration().configure(); SessionFactoryImpl sessionFactory = (SessionFactoryImpl) configuration.buildSessionFactory(); EventListenerRegistry listenerRegistry = sessionFactory.getServiceRegistry().getService(EventListenerRegistry.class); SolrIndexEventListener indexListener = new SolrIndexEventListener(); // a SaveOrUpdateEventListener i wanted to attach listenerRegistry.appendListeners(EventType.SAVE_UPDATE, indexListener); 

我不得不以编程方式追加事件监听器,因为Configuration不再在hibernate.cfg.xml中查找它们

即使在4.3.0 API中也有更新。 ServiceRegistryBuilder在4.3.0中也被弃用,并被StandardServiceRegistryBuilder取代。 现在创build会话工厂的实际代码将在创build会话工厂时看起来如此。

[引自http://www.javabeat.net/session-factory-hibernate-4/%5D

在hibernate核心框架中有许多API被弃用。 现在令人沮丧的一点是,hibernate官方文档没有提供关于如何使用新API的明确说明,并且说明文档是完整的。 另外,每个增量版本都会对一些重要的API进行更改。 其中一个就是在Hibernate 4.3.0中创build会话工厂的新API。 在我们早期的版本中,我们已经创build了如下的会话工厂:

 SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 

buildSessionFactory方法从hibernate 4版本被弃用,并且被新的API取代。 如果你使用的是4.3.0及以上版本,你的代码必须是:

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

ServiceRegistryBuilder类由4.3.0中的StandardServiceRegistryBuilderreplace。 看起来5.0版本将会有很多变化。 仍然没有太多的清晰的弃用的API和使用合适的替代品。 每个增量版本都有更多不赞成使用的API,它们正在微调5.0版本的核心框架。

buildSessionFactory方法从Hibernate 4版本被弃用,并且被新的API取代。 如果你使用的是Hibernate 4.3.0及以上版本,你的代码必须是:

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

在早期版本中,会话工厂创build如下:

 SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 

buildSessionFactory方法从hibernate 4版本被弃用,并且被新的API取代。 如果您使用的是hibernate 4.3.0及以上版本,则您的代码必须如下所示:

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