【问题标题】:Singleton SessionFactory doesn't work for Hibernate 4.3.1Singleton SessionFactory 不适用于 Hibernate 4.3.1
【发布时间】:2021-11-04 10:06:44
【问题描述】:

我正在构建一个产品管理系统,并准备了我的数据库 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(); 尝试了更多的单例示例,但无法弄清楚。如果你能告诉我我做错了什么,我会很高兴。

【问题讨论】:

    标签: hibernate singleton sessionfactory


    【解决方案1】:

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

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

    【讨论】:

    • 之后我尝试使用 session.beginTransaction();但它说包会话不存在。
    • 我不确定您在做什么,因为您没有发布代码,但看起来您对 Java 不是很熟悉。我可能会建议您了解一下如何在 Java 中实现 OOP 设计:继承、接口、包、导入等。然后尝试使用 Hibernate
    猜你喜欢
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 2012-01-24
    • 2019-08-16
    • 2020-02-06
    • 2011-12-28
    • 1970-01-01
    相关资源
    最近更新 更多