在Hibernate 4中创建会话工厂

时间:2011-11-02 20:13:33

标签: java hibernate

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

org.hibernate.cfg.Configuration conf= HibernateUtil
    .getLimsInitializedConfiguration(systemConfiguration
.getHibernateconfFile());

SessionFactory sf = conf.configure().buildSessionFactory();

现在我需要将ServiceRegistry类传递给buildSessionFactory,但是Javadocs对于如何解决这个问题非常模糊。有什么提示吗?

8 个答案:

答案 0 :(得分:70)

是的,他们已经弃用了以前的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/junit4/BaseCoreFunctionalTestCase.java函数(buildSessionFactory())查看hibernate的官方测试用例。

答案 1 :(得分:18)

试试这个!

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;
    } 
}

答案 2 :(得分:11)

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();

答案 3 :(得分:7)

以下表达了我对hibernate 4.0.0.Final的体验。

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

  

注意:这将取代ServiceRegistryBuilder和。{    org.hibernate.metamodel.MetadataSources在4.0版本之后,此类将被弃用并计划在5.0中删除。请参阅HHH-6183HHH-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();

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

我无法找到一种方法来检查hibernate.cfg.xml中定义的映射和 hibernate.cfg.xml hibernate。前缀>不再是可选的。

这可能适用于某些人。

我,其中之一遇到了一些错误,因为映射文件包含<cache usage="read-write" />并最终使用了弃用的配置方式:

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 :(得分:5)

即使4.3.0 API中有更新。 ServiceRegistryBuilder在4.3.0中也已弃用,并替换为StandardServiceRegistryBuilder。现在,创建会话工厂的实际代码将显示为example on creating session factory

答案 5 :(得分:2)

[引自http://www.javabeat.net/session-factory-hibernate-4/]

hibernate核心框架中不推荐使用许多API。目前令人沮丧的一点是,hibernate官方文档没有提供关于如何使用新API的明确说明以及文档完整的统计信息。此外,每个增量版本都会对某些重要的API进行更改。其中一个问题是用于在病房中的Hibernate 4.3.0中创建会话工厂的新API。在我们早期的版本中,我们创建了会话工厂,如下所示:

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());

类ServiceRegistryBuilder由4.3.0中的StandardServiceRegistryBuilder取代。看起来5.0版本中会有很多变化。对于已弃用的API以及使用的合适替代方案,仍然没有太多的清晰度。每个增量版本都会提供更多已弃用的API,它们可以对5.0版本的核心框架进行微调。

答案 6 :(得分:1)

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

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());

答案 7 :(得分:1)

Hibernate 4版本不推荐使用方法buildSessionFactory,它将替换为新的API。如果您使用的是Hibernate 4.3.0及更高版本,则代码必须是:

Configuration configuration = new Configuration().configure();

StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
        .applySettings(configuration.getProperties());

SessionFactory factory = configuration.buildSessionFactory(builder.build());