java - 在运行时更改 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)
}
}
关闭前一个会话工厂后,代码确实创建了一个新的会话工厂,但创建新的会话工厂似乎有问题。那么这段代码有什么问题呢?
解决方案
推荐阅读
- javascript - Vanilla JS:完全禁用网页中的“保存”功能
- c# - C# - 自动将方法调用传递给具有相同签名的对象的方法
- image - Vulkan - 在 vkQueuePresentKHR,验证层抛出关于图像布局的错误消息
- python - python sqlite3没有打破
- android-studio - 在 android studio 模拟器上运行 React Native 应用程序的问题
- android - 无法识别 Google 登录 sha-1 密钥
- javascript - cytoscape js隐藏新布局不包含的元素
- node.js - 使用 Node.js 可以访问多少网络堆栈?
- python - 使用带有 keras 生成器的 sqlite
- ssis - ssis 在多列匹配上查找转换或条件