首页 > 解决方案 > Singleton SessionFactory 不适用于 Hibernate 4.3.1

问题描述

我正在构建一个产品管理系统,并准备了我的数据库 pojos。之后我想使用单例 sessionFactory 而不是在每个类中使用一个新的。当我创建和构建一个 Java 类时;

package Controller;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

public class SFController {

private static SFController instance = null;

   private static SessionFactory sessionFactory;
   private static StandardServiceRegistry serviceRegistry;

   private SFController(){
        Configuration configuration = new Configuration();
        configuration.configure();
        serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
        sessionFactory = configuration.buildSessionFactory(serviceRegistry);
   }

   public static SFController getInstance(){
        if(instance == null){
            instance  = new SFController();
        }
        return instance;
   }

   public synchronized static SessionFactory getSessionFactory() {
        return sessionFactory;
   }

}

没有任何错误。但我无法弄清楚如何在我的控制器页面中正确使用它。我就是这样尝试的;

package Controller;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;


public class TryObject {
    
    SFController newObject = SFController.getInstance();
    Session session = newObject.getSessionFactory();
        
    
}

TryObject 方法的第二行说将 Session 更改为 SessionFactory。即使我这样做,我也无法到达session.save() 或 session.beginTransaction(); 尝试了更多的单例示例,但无法弄清楚。如果你能告诉我我做错了什么,我会很高兴。

标签: hibernatesingletonsessionfactory

解决方案


您的 getSessionFactory() 方法返回一个 SessionFactory,而不是一个 Session。一旦你有了一个 SessionFactory,你就可以打开一个新的 Session:

SFController newObject = SFController.getInstance();
SessionFactory factory = newObject.getSessionFactory();
Session session = factory.openSession();

推荐阅读