当前位置: 首页 > 面试题库 >

在运行时修改hibernate.cfg.xml

吕征
2023-03-14
问题内容

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

我的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的输出未更改。不用说,我的其余代码可以访问未更改的数据库,而不是我想从运行时访问的数据库。

如何在运行时修改此值?

非常感谢!


问题答案:

我找到了解决问题的方法。问题是,当我想在其余的代码中使用新配​​置时,“因为每笔交易我都打开了一个新会话(如hibernate所建议),但是该会话始终是在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);
    }
  }

然后,每当我要访问该新连接时,在每次事务开始时,我都调用会话指向同一类HibernateUtil.java。

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

如果不将第一个函数放在此类中,则打开的会话始终是配置文件中默认情况下的那个会话。



 类似资料:
  • 我在Spring框架中使用ehcache。我正在使用ehcache.xml初始化ehcache。然而,我想在运行时添加某些属性,如terracottaconfig。为此,我覆盖了类EhCacheManagerFactoryBean。目前,我正在覆盖这个类的方法getObject()(我不知道这是否是一个正确的覆盖,因为在使用ehcache.xml文件初始化类之前,调用了其他方法setResourc

  • 问题内容: 而且我正在尝试更改方法注释,但是java.lang.reflect.Method不包含任何地图字段(例如“ annotations”)或方法(例如“ getDeclaredAnnotationMap”) 只有但是我可以用这个字节数组做什么? 那么,如何修改方法的注释呢? 编辑: 我创建了:http : //pastebin.com/T2rewcwU 但是,仅编辑此方法实例,如果取消注释

  • 问题内容: 我们在模型pojos中的一些方法已被注释为: columnDefinition 属性取决于数据库供应商,因此在尝试使用Hibernate删除HSQLDB中的架构时会失败: 为了解决这个问题,我正在考虑这个解决方案(但不想花时间,如果不可能的话),在运行时,为每个方法列加注: 获取@Column批注 创建列注释的副本,使用javaassist将columnDefinition设置为nul

  • 我想在服务器运行时在运行时添加或删除SpringCloudGateway路由。我正在使用Fluent Java Routes API初始化网关路由。这是完美的工作。 但是,现在我想在SpringCloudGateway服务器运行时修改、添加和删除路由。我可以看到RouteLocator包含我的路由,但我看不到修改其内容的方法。 尽管我看到一些在执行器中创建新路由的能力,但我需要使用Java代码而不

  • 问题内容: 假设我有一个豆子: 然后使用这种测试代码将其转换为JSON或XML: 输出将是这样的: 现在,假设我想用一些动态名称替换“ data”属性: 如果我调用函数 convert(“ toto”), 我将获得以下输出: 如果我调用函数 convert(“ groovy”), 我会得到以下输出: 当然,我可以在JSON创建后执行String替换,但是如果您对程序化方法有一个满意的答案,我会接受

  • 问题内容: 我有一个运行的现有jar文件。它是Selenium RC服务器。我希望能够更改JVM httpProxy.host/port/etc系统值。一方面,我可以修改源代码并添加此功能。这将需要一些时间。还有另一种可能的方法吗?就像我自己的JAR(将设置这些JVM属性)在同一个JVM实例中调用selenium- rc(这样,它便能够修改其JVM变量的值)? 问题答案: 您可以使用以下命令在命令