如何在运行时在 Tapestry 5 中动态设置 Hibernate 配置

How to dynamically set Hibernate configuration in Tapestry 5 at runtime

我目前在我的应用程序中使用 Tapestry 5,其中数据源是通过 hibernate.cfg.xml 设置的。 我希望能够在运行时将数据源动态更改为非 JNDI 数据源。 我实现了使用以下代码以编程方式完成它:

Configuration configuration = new Configuration();
configuration.setProperty("hibernate.connection.driver_class", "org.postgresql.Driver");
configuration.setProperty("hibernate.connection.url", dbUrl + "?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory");
configuration.setProperty("hibernate.connection.username", username);
configuration.setProperty("hibernate.connection.password", password);
SessionFactory sf = configuration.buildSessionFactory();
Session newSession = sf.openSession();
newSession.clear();

这行得通。当我使用这个会话时,我成功地访问了我的数据源。 但是,当我打电话给

session.saveOrUpdate(entry);

在某些时候,Hibernate 会尝试使用 hibernate.cfg.xml 中设置的数据源。你有什么想法,如何解决这个问题?

我假设您熟悉 Tapestry IOC 概念。您需要覆盖 HibernateSessionSource 服务 (org.apache.tapestry5.hibernate.HibernateSessionSource)。还有其他几种方法可以实现它,但是您可以创建 HibernateConfigurationUpdater 服务,该服务知道您本地的 HibernateSessionSourceImpl 覆盖版本(即,在构建它时将 impl 的引用设置为 HibernateConfigurationUpdater 服务)。 HibernateConfigurationUpdater.changeConfiguration(Configuration configuration) 一旦收到新配置,就会调用(您的)CustomHibernateSessionSourceImpl.setSessionFactory()。您需要考虑同步问题。另外,请确保您确实需要动态配置——多租户是否不足以满足您的需求? (至少 JPA 完美地支持多租户 - 唯一的区别是您需要在启动时了解所有数据源)。