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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/22367759/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 15:18:20  来源:igfitidea点击:

How to retrieve sessionFactory from Hibernate 4.3.4.Final?

javahibernatesessionfactory

提问by AlexCartio1

Previously I was using the following code to configure the sessionFactory, but after upgrading the version of my hibernate from 4.2.1.Final to 4.3.4.Final, I can not retrieve sessionFactory using the following code as ServiceRegistryBuilder() is deprecated.

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

I used this linkto create it but the provided function is not returning any thing therefore it runs into pre-compile error.

我使用这个链接来创建它,但提供的函数没有返回任何东西,因此它遇到了预编译错误。

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

采纳答案by pickypg

In 4.3, you should use the StandardServiceRegistryBuilderinstead.

在 4.3 中,您应该使用StandardServiceRegistryBuilder代替。

import org.hibernate.boot.registry.StandardServiceRegistryBuilder

StandardServiceRegistryBuilderwas added as a new parentof ServiceRegistryBuilder. The rest of the code should be the same. The only place that I have found this documented "clearly" is in the 4.3 JavaDocs for ServiceRegistryBuilder.

StandardServiceRegistryBuilder被添加为 的新ServiceRegistryBuilder。其余代码应该相同。我发现这个文档“清楚”的唯一地方是 4.3 JavaDocs for ServiceRegistryBuilder.

One thing that I did not notice was that they changed the ServiceRegistryBuilder.buildServiceRegistry()method to just StandardServiceRegistryBuilder.build(). Therefore, it will require you to change that part of your building process:

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

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

Becomes:

变成:

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

回答by zee

Yes, they have deprecated the previous ServiceRegistryBuilder(), here is how you can do it with Hibernate 4.3.4

是的,他们已经弃用了以前的 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.");
    }

Source: Create session factory in Hibernate 4

来源:在 Hibernate 4 中创建会话工厂

回答by Koala

I tested this one and it works on Hibernate 4.3.6

我测试了这个,它适用于 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();
}  }
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();
}  }