0 Replies Latest reply on Jul 30, 2008 2:54 AM by Thorsten Maier

    Reconfigure the

    Thorsten Maier Newbie

      Hello,

      I want a seperate DB schema for every mandator in our application so that the data is not mixed between different mandators. The schemas should be generate dynamicly during runtime. I use something like this to generate the tables of the schema:

      Map<String, String> props = new Hashtable<String, String>();
      props.put(HIBERNATE_DEFAULT_SCHEMA, userName);
      Ejb3Configuration cfg = new Ejb3Configuration();
      Ejb3Configuration configured = configured = cfg.configure(persistenceUnitName, properties);
      String[] lines = cfg.getHibernateConfiguration().generateSchemaCreationScript(new PostgreSQLDialect());
      for (int i = 0; i < lines.length; i++) {
       entityManager.createNativeQuery(lines).executeUpdate();
       }
      


      So far every thing work pretty good. The tables in the database are generated during runtime for a new "userName" (I generate the schema in the db with something like "CREATE SCHEMA %%username%%" before)

      So far so good. Now my problem:
      I want to persist some data into the new generated tables within the new schema. For that I want to change the property "hibernate.default_schema" of the persistence.xml config file during runtime.

      I tried several things to do so, but nothing help me to solve the problem. I'm not able to generate a new EntityManager because of transaction reasons. So I have to change the existing EntityManager during runtime.

      Different things I tried:

      1. EntityManagerFactory
      I use the EntityManagerFactory and call the method "createEntityManager(Map arg)". My map looks like this:

      Map<String, String> props = new Hashtable<String, String>();
      props.put("hibernate.default_schema", userName);
      


      I get a new EntityManager but this instance is still using the hibernate.default_schema out of persistence.xml

      2. Ejb3Configuration
      I use the Ejb3Configuration class to generate a new EntityManager with the new "hibernate.default_schema". Perhaps this would work, but I can't do this because of transaction reasons.

      2. Hibernate Delegate

      Map<String, String> props = new Hashtable<String, String>();
      props.put("hibernate.default_schema", userName);
      SessionImpl sessionImpl = ((org.hibernate.impl.SessionImpl) entityManager.getDelegate());
      sessionImpl.getFactory().getConnectionProvider().configure(props);


      I tried to use the Hibernate delegate of JPA to reconfigure the ConnectionProvider too. After that I establish a new database connection, but the "default_schema" do not change after this reconfiguration.

      Is it possible to reconfigure the "hibernate.default_schema" during runtime? And how?

      Hibernate version: 3.2.4.sp1

      App-Server: JBoss 4.2.3.GA

      DB: postgresql-8.3-603