gpt4 book ai didi

java - hibernate.cfg.xml 运行时修改

转载 作者:行者123 更新时间:2023-11-30 06:20:13 25 4
gpt4 key购买 nike

我有这个问题,有些人已经解决了,但问题是我不明白我的实现中缺少什么。

我的部分hibernate代码如下:

<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/Database</property>
<property name="hibernate.connection.username">username</property>
<property name="hibernate.connection.password">password</property>

问题是我想通过更改 hibernate.connection.url 属性中的“数据库”一词来选择我想在运行时使用的数据库。

在 javaswing 中,我正在实现这个函数:

public static void SetSessionFactory(String url) {
try {

AnnotationConfiguration conf = new AnnotationConfiguration().configure();
// <!-- Database connection settings -->
conf.setProperty("hibernate.connection.url", url);
SessionFactory SESSION_FACTORY = conf.buildSessionFactory();

//DEBUG1=With this output I intend to check if the parameter has changed
System.out.println("Connection changed to " + conf.getProperty("hibernate.connection.url"));

} catch (Throwable ex) {
// Log exception!
throw new ExceptionInInitializerError(ex);
}

然后,我使用按钮检查所做的更改,从组合框中选择我想要的数据库:

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
// TODO add your handling code here:
String url;
int areaIndex = this.areaComboBox.getSelectedIndex();

switch (areaIndex) {
case 0:
url="jdbc:postgresql://localhost:5432/Database";
break;
case 1:
url="jdbc:postgresql://localhost:5432/Database1";
break;
case 2:
url="jdbc:postgresql://localhost:5432/Database2";
break;
default:
url="jdbc:postgresql://localhost:5432/Database";
break;
}
SetSessionFactory(url);

AnnotationConfiguration config = new AnnotationConfiguration().configure();
//DEBUG2= With this output I want to confirm the changes of the property outside the setSessionFactory function
System.out.println("DATABASE= " + config.getProperty("hibernate.connection.url"));
}

现在,debug1 的输出正在改变,所以我在这个打印中得到了我想要的数据库的名称,但 debug2 的输出没有改变。不用说,我的其余代码可以访问未更改的数据库,而不是我想从运行时访问的数据库。

我怎样才能在运行时修改这个值?

非常感谢!

最佳答案

我找到了解决问题的方法。问题是,当我想在其余代码中使用新配​​置时,我做不到,因为对于每个事务,我都打开了一个新 session (按照 hibernate 的建议),但那个 session 始终是那个 session 在 hibernate.cfg.xml 文件的开头。另外,我在一个按钮中定义了我的配置功能。

现在我改变了我的函数的位置并将它放在 HibernateUtil.java 中,只添加了我需要的配置和一些以后可能有用的配置

public static void SetSessionFactory(String url, String user, String pass) {
try {

AnnotationConfiguration conf = new AnnotationConfiguration().configure();
// <!-- Database connection settings -->
conf.setProperty("hibernate.connection.url", url);
conf.setProperty("hibernate.connection.username", user);
conf.setProperty("hibernate.connection.password", pass);
sessionFactory = conf.buildSessionFactory();

} catch (Throwable ex) {
// Log exception!
throw new ExceptionInInitializerError(ex);
}
}

然后,任何时候我想访问那个新连接,在每个事务的开始我调用 session 指向同一个类 HibernateUtil.java

public Session session = HibernateUtil.getSessionFactory().openSession();

如果不将第一个函数放在此类中,则打开的 session 始终是配置文件中默认设置的 session 。

关于java - hibernate.cfg.xml 运行时修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22200773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com