繁体   English   中英

在Hibernate 4中创建会话工厂

[英]Create session factory in Hibernate 4

我在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的官方测试用例。 /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();

以下表示我使用hibernate 4.0.0.Final的经验。

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

注意:在4.0版本之后,将替换为使用ServiceRegistryBuilderorg.hibernate.metamodel.MetadataSources ,此时此类将被弃用并计划在5.0中删除。 有关详细信息,请参见HHH-6183HHH-2578HHH-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中定义的映射 前缀在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.3.0 API中有更新。 ServiceRegistryBuilder在4.3.0中也已弃用,并替换为StandardServiceRegistryBuilder。 现在,创建会话工厂的实际代码将在创建会话工厂时查看此示例

[引自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版本的核心框架进行微调。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM