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

Java 如何从Hibernate 4.3.4.Final检索sessionFactory?,java,hibernate,sessionfactory,Java,Hibernate,Sessionfactory,以前我使用以下代码配置sessionFactory,但在将hibernate版本从4.2.1.Final升级到4.3.4.Final后,我无法使用以下代码检索sessionFactory,因为ServiceRegistryBuilder()已被弃用 我曾经创建过它,但是提供的函数没有返回任何东西,因此它会遇到预编译错误 private static SessionFactory configureSessionFactory() { try { Conf

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

我曾经创建过它,但是提供的函数没有返回任何东西,因此它会遇到预编译错误

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

在4.3中,您应该使用

StandardServiceRegistryBuilder
已添加为
ServiceRegistryBuilder
的新父级。代码的其余部分应该是相同的。我发现这个文档“清晰”的唯一地方是4.3Javadocs for

我没有注意到的一件事是,他们将方法更改为just。因此,它将要求您更改建筑过程的该部分:

new ServiceRegistryBuilder()
        .applySettings(configuration.getProperties())
        .buildServiceRegistry();
变成:

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

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

来源:

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


您的方法
setField
的作用是什么?毕竟,它听起来非常关键……它返回以下错误java.lang.reflect.InvocationTargetException,java.lang.NoSuchMethodError:org.hibernate.integrator.internal.IntegratorServiceImpl(Ljava/util/LinkedHashSet;Lorg/hibernate/boot/registry/classloading/spi/ClassLoaderService;)VMessages:org.hibernate.integrator.internal.IntegratorServiceImpl.(Ljava/util/LinkedHashSet;Lorg/hibernate/boot/registry/ClassLoaderService;)V文件:org/hibernate/boot/registry/BootstrapServiceRegistryBuilder.java行号:215确保已从类路径中删除所有以前版本的hibernate。从上面看,我不明白为什么会出现这种情况,除非您的类加载器问题是由版本冲突引起的,因为您正在/正在使用的两个版本中都存在
integratorserviceinpl
,这向我暗示了类加载器问题。@pickypg请也看看我的问题,ServiceRegistryBuilder在版本4.3.4.Finalversion 4.3.4.Final@AlexCartio1上被弃用。您的问题标题中已经提到了哪个版本的详细信息。无论如何,为了更加清晰,我添加了.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.");
    }
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();
}  }