【问题标题】:How to retrieve sessionFactory from Hibernate 4.3.4.Final?如何从 Hibernate 4.3.4.Final 中检索 sessionFactory?
【发布时间】: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是做什么的?毕竟这听起来很关键......

标签: java hibernate sessionfactory


【解决方案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 请也看看我的问题,stackoverflow.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();
}  }

【讨论】:

    猜你喜欢
    • 2014-07-02
    • 2015-09-26
    • 1970-01-01
    • 2010-11-17
    • 2011-12-28
    • 2015-05-11
    • 2013-03-14
    • 2015-12-02
    • 2011-01-29
    相关资源
    最近更新 更多