当我将Hibernate版本从3.6.8更新到4.0.0时,我在这一行中得到了关于已弃用方法buildSessionFactory()的警告:

private static final SessionFactory sessionFactory =
         new Configuration().configure().buildSessionFactory();

Javadoc建议使用另一种方法

buildSessionFactory (ServiceRegistry ServiceRegistry)

但在文档中我发现了弃用的变体


当前回答

Tested on 4.2.7 release

package com.national.software.hibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

import com.national.software.dto.UserDetails;

public class HibernateTest {

    static SessionFactory sessionFactory;

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        UserDetails user = new UserDetails();
        user.setUserId(1);
        user.setUserName("user1");

        Configuration config = new Configuration();
        config.configure();

        ServiceRegistry  serviceRegistry = (ServiceRegistry) new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
        sessionFactory = config.buildSessionFactory(serviceRegistry);

        Session session = sessionFactory.openSession();
        session.beginTransaction();
        session.save(user);
        session.getTransaction().commit();

    }

}

其他回答

如果你正在使用Hibernate 5.2及以上版本,那么你可以使用这个:

  private static StandardServiceRegistry registry;
  private static SessionFactory sessionFactory;

  public static SessionFactory getSessionFactory() {
    if (sessionFactory == null) {
      try {
        // Creating a registry
        registry = new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build();

        // Create the MetadataSources
        MetadataSources sources = new MetadataSources(registry);

        // Create the Metadata
        Metadata metadata = sources.getMetadataBuilder().build();

        // Create SessionFactory
        sessionFactory = metadata.getSessionFactoryBuilder().build();

      } catch (Exception e) {
        e.printStackTrace();
        if (registry != null) {
          StandardServiceRegistryBuilder.destroy(registry);
        }
      }
    }
    return sessionFactory;
  }

  //To shut down
 public static void shutdown() {
    if (registry != null) {
      StandardServiceRegistryBuilder.destroy(registry);
    }
  }

这里有很多hibernate核心框架中已弃用的api。

我们已经创建了会话工厂,如下所示:

SessionFactory SessionFactory = new Configuration().configure(). buildessionfactory ();

方法buildSessionFactory在hibernate 4发行版中已弃用,并被新的API所取代。如果你使用hibernate 4.3.0及以上版本,你的代码必须是:

配置Configuration = new Configuration().configure(); StandardServiceRegistryBuilder生成器= new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()); SessionFactory factory = configuration.buildSessionFactory(builder.build());

从4.3.0开始,类ServiceRegistryBuilder被StandardServiceRegistryBuilder取代。看起来在5.0版本中会有很多变化。但是,对于已弃用的api和适合使用的替代方案仍然没有太多的明确说明。每一个增量版本都会出现更多弃用的API,它们都是为了5.0版本的核心框架进行微调。

在Hibernate 4.2.2中

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

public class Test {
    public static void main(String[] args) throws Exception
{
    Configuration configuration = new Configuration()
            .configure();

    ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(
            configuration.getProperties()).buildServiceRegistry();

    SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);

    Session session = sessionFactory.openSession();

    Transaction transaction = session.beginTransaction();

    Users users = new Users();

    ... ...

    session.save(users);

    transaction.commit();

    session.close();

    sessionFactory.close();

    }
}

在不同版本的文档之间发现差异并不罕见。大多数开发人员认为文档是一件苦差事,他们倾向于推迟它。

根据经验,如果javadoc说了一件事,而一些非javadoc的文档与之相矛盾,那么javadoc很可能更准确。程序员更倾向于让javadoc与代码的变化保持同步…因为javadoc的“源代码”与代码在同一个文件中。

在@deprecated标记的情况下,javadoc几乎肯定更准确。开发人员经过仔细考虑后反对使用……而且(一般来说)他们不会对它们进行undeprecated。

public class HibernateSessionFactory {

private static final SessionFactory sessionFactory = buildSessionFactory1();

private static SessionFactory buildSessionFactory1() {
Configuration configuration = new Configuration().configure(); // configuration
                                                                // settings
                                                                // from
                                                                // hibernate.cfg.xml

StandardServiceRegistryBuilder serviceRegistryBuilder = new StandardServiceRegistryBuilder();


serviceRegistryBuilder.applySettings(configuration.getProperties());

ServiceRegistry serviceRegistry = serviceRegistryBuilder.build();

return configuration.buildSessionFactory(serviceRegistry);
}

public static SessionFactory getSessionFactory() {
return sessionFactory;
 }

public static void shutdown() {
// Close caches and connection pools
getSessionFactory().close();
 }