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

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

Javadoc建议使用另一种方法

buildSessionFactory (ServiceRegistry ServiceRegistry)

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


当前回答

道理很简单:JBoss文档并不是100%维护得很好。按照JavaDoc的说法:buildSessionFactory(ServiceRegistry ServiceRegistry)。

其他回答

在最新的hibernate 4.3.0版本中创建SessionFactory对象的更好方法如下:

Configuration configuration = new Configuration().configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().
applySettings(configuration.getProperties());
SessionFactory factory = configuration.buildSessionFactory(builder.build());

是的,它被弃用了。用下面的代码替换你的SessionFactory:

在Hibernate 4.0, 4.1, 4.2

private static SessionFactory sessionFactory;
private static ServiceRegistry serviceRegistry;

public static SessionFactory createSessionFactory() {
    Configuration configuration = new Configuration();
    configuration.configure();
    ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(
            configuration.getProperties()). buildServiceRegistry();
    sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    return sessionFactory;
}

更新:

在Hibernate 4.3中,ServiceRegistryBuilder已弃用。请使用以下语句。

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

只需导入以下包,

import org.hibernate.cfg.Configuration;

代码已验证可在Hibernate 4.3.0中工作。注意,您可以删除XML文件名参数,或者提供您自己的路径。这与这里的其他帖子类似(但错别字更正了),但这一篇是正确的。

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;    


Configuration configuration = new Configuration();
configuration.configure("/com/rtw/test/hiber/hibernate.cfg.xml");
ServiceRegistry  serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();        
    sessionFactory = configuration.buildSessionFactory(serviceRegistry);

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

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

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