Hibernate中的buildSessionFactory()配置方法是否已被弃用?

223

当我将Hibernate版本从3.6.8更新到4.0.0时,我在下面这行代码中收到了一个有关废弃方法buildSessionFactory()的警告:

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

根据Javadoc的建议,推荐使用另一种方法:buildSessionFactory(ServiceRegistry serviceRegistry)

但在文档中,我发现有一个已弃用的变体。


即使在4.3.8快速入门指南中,他们也使用了这个示例:new Configuration().configure().buildSessionFactory(); :( - Venkata Raju
@VenkataRaju 可能并不糟糕,因为在 Hibernate 5 中一切都回归正常,这个例子是正确的,但是 (!) 这里的所有配置示例都不适用于 Hibernate 5 - v.ladynev
18个回答

1
如果有人在更新到5.1之后,以下是它的工作方式。
StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
                MetadataSources sources = new MetadataSources(registry);
                Metadata metadata = sources.getMetadataBuilder().build();
                sessionFactory = metadata.getSessionFactoryBuilder().build();

在 Hibernate 4.3 中,使用以下内容替换上述内容

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

0

在 hibernate 核心框架中有许多已弃用的 API。

我们创建了以下会话工厂:

SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

从 hibernate 4 版本开始,方法 buildSessionFactory 已被弃用,并被新的 API 替代。如果您使用的是 hibernate 4.3.0 及以上版本,则代码如下:

  1. Configuration configuration = new Configuration().configure();

  2. StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());

  3. SessionFactory factory = configuration.buildSessionFactory(builder.build());

从 4.3.0 开始,类 ServiceRegistryBuilder 被 StandardServiceRegistryBuilder 替换。看起来在 5.0 版本中将会有很多变化。目前还没有关于弃用的 API 和适当替代方案的明确说明。每个增量发布都会带来更多弃用的 API,这是为了对核心框架进行微调以适应 5.0 版本的发布。


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

    }

}

0
hibernate 5.3.1 中,您可以尝试这样做:
ServiceRegistry standardRegistry = 
                new StandardServiceRegistryBuilder().configure().build();

Metadata sources = new MetadataSources(standardRegistry).addAnnotatedClass(MyEntity.class).getMetadataBuilder().build();

SessionFactory sf = sources.buildSessionFactory();

0

我编辑了上面的batbaatar创建的方法,使其接受Configuration对象作为参数:

    public static SessionFactory createSessionFactory(Configuration configuration) {
        serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
                configuration.getProperties()).build();
        factory = configuration.buildSessionFactory(serviceRegistry);
        return factory;
    }

在主类中,我做了以下操作:
    private static SessionFactory factory;
    private static Configuration configuration 
    ...      
    configuration = new Configuration();
    configuration.configure().addAnnotatedClass(Employee.class);
    // Other configurations, then           
    factory = createSessionFactory(configuration);

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

    }
}

0

公共的无返回值方法 sampleConnection() 抛出异常 {

     Configuration cfg = new Configuration().addResource("hibernate.cfg.xml").configure();
     StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
     SessionFactory sessionFactory = configuration.buildSessionFactory(ssrb.build());
     Session session = sessionFactory.openSession();
     logger.debug(" connection with the database created successfuly.");
}

-1

只需导入以下包:

import org.hibernate.cfg.Configuration;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接