首页 > 解决方案 > 在运行时更改 Hibernate 配置时遇到问题

问题描述

我为 Hibernate & H2 数据库测试目的开发了一个 Java 独立应用程序。这个应用程序工作简单;首先,它在当前机器磁盘空间上配置一个数据库连接(使用 H2 URL-Only 特性),然后它关闭当前会话工厂并尝试初始化一个新的配置到一个新的 H2 数据库。一切都很好,但是在向 Hibernate 发送查询时切换到新数据库后,将显示此错误:

java.lang.IllegalStateException: EntityManagerFactory is closed

这是 Hibernate 配置类:

public class ProjectHibernateConfiguration {
    private SessionFactory sessionFactory;
    private static ProjectHibernateConfiguration instance;

    private ProjectHibernateConfiguration(String url) {
        try {
            Configuration configuration = new Configuration();

            Properties settings = new Properties();
            settings.put(Environment.DRIVER, "org.h2.Driver");
            settings.put(Environment.URL, "jdbc:h2:" + url);
            settings.put(Environment.USER, "user");
            settings.put(Environment.PASS, "pass");
            settings.put(Environment.SHOW_SQL, "true");
            settings.put(Environment.DIALECT, "org.hibernate.dialect.H2Dialect");
            settings.put(Environment.HBM2DDL_AUTO, "update");
            settings.put(Environment.CURRENT_SESSION_CONTEXT_CLASS, "thread");
            settings.put(Environment.C3P0_MIN_SIZE, "5");
            settings.put(Environment.C3P0_MAX_SIZE, "20");
            settings.put(Environment.C3P0_TIMEOUT, "1800");


            configuration.setProperties(settings);

            ServiceRegistry registry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties())
                                                                           .build();
            sessionFactory = configuration.buildSessionFactory(registry);
        } catch (Exception ignored) {
        }
    }

    public static void initializeConfiguration(String url) {
        instance = new ProjectHibernateConfiguration(url);
    }

    public static ProjectHibernateConfiguration getInstance() {
        return instance;
    }

    public Session getCurrentSession() {
        return sessionFactory.getCurrentSession();
    }

    public Session openSession() {
        return sessionFactory.openSession();
    }

    public void closeSessionFactory() {
        this.sessionFactory.close();
    }

主要课程:

public class Main {
    public static void main(String[] args) {
        ProjectHibernateConfiguration.initializeConfiguration("path to a H2 database");
        //Performing some queries to database (no problems)
        ProjectHibernateConfiguration.getInstance().closeSessionFactory();

        ProjectHibernateConfiguration.initializeConfiguration("path to a new H2 database");
        //Performing queries to new initialized database (getting error: java.lang.IllegalStateException: EntityManagerFactory is closed)
    }
}

关闭前一个会话工厂后,代码确实创建了一个新的会话工厂,但创建新的会话工厂似乎有问题。那么这段代码有什么问题呢?

标签: javahibernateh2

解决方案


推荐阅读