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

时间:2016-05-25 14:54:56

标签: hibernate datasource tapestry

我目前在我的应用程序中使用Tapestry 5,其中数据源是通过h​​ibernate.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中设置的数据源。你有什么想法,如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

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