单例SessionFactory的这种方法正确吗?

时间:2019-09-16 15:22:48

标签: java hibernate singleton sessionfactory

我正在使用Hibernate而不使用@annotations

我尝试了以下代码:

    public class HibernateUtil {

    private static final SessionFactory sessionFactory;
    private static StandardServiceRegistryBuilder builder;

    static {
        try {
            Configuration configuration = new Configuration().configure();
            configuration.configure("hibernate.cfg.xml");
            builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
            sessionFactory = configuration.buildSessionFactory(builder.build());
        } catch (HibernateException ex) {
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

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

客户代码:

    public static void main (String[] args) {                                         
    SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
    Session session = sessionFactory.openSession();
    session.beginTransaction();
    Criteria criteria = session.createCriteria(Customer.class);
    List<Customer> customers = criteria.list();
    for (Customer customer : customers) {
        //print values
    }
    session.getTransaction().commit();
    session.close();
}
  

这也是我想知道的重要事情
  如果要在客户端 HibernateUtil中创建class类对象怎么办?

HibernateUtil hibernateUtil = new HibernateUtil();

2 个答案:

答案 0 :(得分:0)

您可以参考stackoverflow链接: What are the advantages and disadvantages of creating an Object in static block in Java?

如果您希望在服务器或应用程序启动时创建SessionFactory,则可以使用静态块。否则,请使用静态方法。您还可以使用枚举创建单例。

答案 1 :(得分:0)

因此,您有两个问题,一个是创建单例的正确方法,另一个是在客户端中创建HibernateUtil实例时会发生什么。

首先使用HibernateUtil

对于第二个问题,如果每个客户端都创建HibernateUtil类的实例,就可以了,因为该变量是静态的。如果一切按计划进行,那么只会有一个Hibernate SessionFactory实例。

至于您是否具有正确的Hibernate SessionFactory单例实现?这是一个很难回答的问题。虽然您的代码看起来不错,但多个类加载器可能会导致单例的各种无法预测的问题。如果单独的类加载器创建一个实例,则您可能有多个单例实例,这是您想要避免的悖论。

EJB和Spring Singleton帮助

使用EJB规范,可以将会话bean标记为单例。如果您使用的是Java Web Profile兼容服务器,我会这样做。如果您使用的是Spring Boot,请使用它们提供的单例功能。如果它是独立的应用程序,请注意特殊的,非单一的SessionFactory行为。