如何从 Hibernate 4.3.4.Final 中检索 sessionFactory?

Posted

技术标签:

【中文标题】如何从 Hibernate 4.3.4.Final 中检索 sessionFactory?【英文标题】:How to retrieve sessionFactory from Hibernate 4.3.4.Final? 【发布时间】:2014-04-17 13:06:19 【问题描述】:

以前我使用以下代码配置 sessionFactory,但是在将我的休眠版本从 4.2.1.Final 升级到 4.3.4.Final 后,我无法使用以下代码检索 sessionFactory,因为 ServiceRegistryBuilder() 是已弃用。

我使用this link 创建它,但提供的函数没有返回任何东西,因此它会遇到预编译错误。

 private static SessionFactory configureSessionFactory() 
        try 
            Configuration configuration = new Configuration();
            configuration.configure();
            serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
            sessionFactory = configuration.buildSessionFactory(serviceRegistry);
            return sessionFactory;
         catch (HibernateException e) 
            System.out.append("** Exception in SessionFactory **");
            e.printStackTrace();
        
        return sessionFactory;
    

     static 
    try 
        sessionFactory = configureSessionFactory();
     catch (Exception e) 
        System.err.println("%%%% Error Creating SessionFactory %%%%");
        e.printStackTrace();
    


private HibernateUtil() 


public static SessionFactory getSessionFactory() 
    return sessionFactory;


public static Session getSession() throws HibernateException 
    Session session = threadLocal.get();

    if (session == null || !session.isOpen()) 
        if (sessionFactory == null) 
            rebuildSessionFactory();
        
        session = (sessionFactory != null) ? sessionFactory.openSession() : null;
        threadLocal.set(session);
    

    return session;


public static void rebuildSessionFactory() 
    try 
        sessionFactory = configureSessionFactory();
     catch (Exception e) 
        System.err.println("%%%% Error Creating SessionFactory %%%%");
        e.printStackTrace();
    


public static void closeSession() throws HibernateException 
    Session session = (Session) threadLocal.get();
    threadLocal.set(null);

    if (session != null) 
        if (session.isOpen()) 
            session.close();
        
    

【问题讨论】:

你的方法setField是做什么的?毕竟这听起来很关键...... 【参考方案1】:

在 4.3 中,您应该改用 StandardServiceRegistryBuilder

import org.hibernate.boot.registry.StandardServiceRegistryBuilder

StandardServiceRegistryBuilder 被添加为ServiceRegistryBuilder 的新。其余的代码应该是一样的。我发现这个“清楚地”记录在案的唯一地方是 ServiceRegistryBuilder 的 4.3 JavaDocs。

我没有注意到的一件事是他们将 ServiceRegistryBuilder.buildServiceRegistry() 方法更改为 StandardServiceRegistryBuilder.build()。因此,这将需要您更改构建过程的这一部分:

new ServiceRegistryBuilder()
        .applySettings(configuration.getProperties())
        .buildServiceRegistry();

变成:

new StandardServiceRegistryBuilder()
        .applySettings(configuration.getProperties())
        .build();

【讨论】:

它返回以下错误 java.lang.reflect.InvocationTargetException, java.lang.NoSuchMethodError: org.hibernate.integrator.internal.IntegratorServiceImpl.(Ljava/util/LinkedHashSet;Lorg/hibernate/boot/registry /classloading/spi/ClassLoaderService;)V 消息:org.hibernate.integrator.internal.IntegratorServiceImpl.(Ljava/util/LinkedHashSet;Lorg/hibernate/boot/registry/classloading/spi/ClassLoaderService;)V 文件:org/hibernate/boot /registry/BootstrapServiceRegistryBuilder.java 行号:215 确保您已从类路径中删除了所有以前版本的 Hibernate。在github 上查看它,我不明白为什么会导致除非您遇到由版本冲突引起的类加载器问题,因为IntegratorServiceImpl 存在于您/曾经的两个版本中using,这向我暗示了一个类加载器问题。 @pickypg 请也看看我的问题,***.com/questions/23646389/…【参考方案2】:

是的,他们已经弃用了之前的 ServiceRegistryBuilder(),这里是你如何使用 Hibernate 4.3.4 来做到这一点

public void testConnection() throws Exception 

            logger.info("Trying to Connect With a DataBase.");
            Configuration configuration = new Configuration();
            configuration.configure("Your.cfg.xml");
            ServiceRegistryBuilder serviceRegistryBuilder = new ServiceRegistryBuilder().applySettings(configuration
                            .getProperties());
            SessionFactory sessionFactory = configuration
                            .buildSessionFactory(serviceRegistryBuilder.buildServiceRegistry());
            Session session = sessionFactory.openSession();
            logger.info("Database connection created successfuly.");
    

来源:Create session factory in Hibernate 4

【讨论】:

ServiceRegistryBuilder 在版本 4.3.4.Final 上已弃用 version 4.3.4.Final @AlexCartio1 您的问题标题中已经提到了哪个版本的详细信息。无论如何,为了更清楚,我添加了 .3.4。【参考方案3】:

我测试了这个,它可以在 Hibernate 4.3.6 上运行

public class HUtil   
  private static SessionFactory sessionFactory;
private static ServiceRegistry serviceRegistry;

public static SessionFactory createSessionFactory() 
  Configuration configuration = new Configuration();
  configuration.configure();
serviceRegistry = new StandardServiceRegistryBuilder().
 applySettings(configuration.getProperties()).build();
  sessionFactory = configuration.configure().      buildSessionFactory(serviceRegistry);
  return sessionFactory;


public static SessionFactory getSessionFactory() 
    return createSessionFactory();
  

【讨论】:

以上是关于如何从 Hibernate 4.3.4.Final 中检索 sessionFactory?的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate:如何从 ScrollableResults 中检索我的实体?

如何从 Spring/Hibernate 调用存储的例程/函数?

如何从 entitymanager 访问 Hibernate 统计信息?

如何从不同位置加载 hibernate.cfg.xml

Hibernate:如何从具有多个类的查询中获取结果

如何使用 Hibernate 从 Observable 列表中删除多个项目