在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."); }
尝试这个!
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为使用
ServiceRegistryBuilder
和org.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());