8 Replies Latest reply on Dec 20, 2007 8:14 AM by pmuir

    Separate database for jBPM

    irvega

      Could you please give a simple example of config required to run the dvd store example in a way that jBPM uses a separate database (ie NOT the orders database)?

      I have tried several combinations of multiple persistence-units + @PersistenceUnit and also leveraging the components.xml file (as per chapter 4 of the doc).

      Exceptions seem to be suggesting that the annotations are being ignored (ie empty unitName on EntityManager's persistence unit).

      PS I think this is a big step in the right direction. I have only just started playing with Seam. The examples are pretty impressive and I have a couple running in Eclipse. The documentation is getting there too.

        • 1. Re: Separate database for jBPM
          monkeyden

          So when you say "separate database" I assume you have multiple persistence units defined in persistence.xml (and components.xml if you're using Seam managed). Did you specify the unitName attribute for the EntityManager in your @PersistenceContext? Otherwise, how would the container know which to use?

          • 2. Re: Separate database for jBPM
            irvega

            Thanks monkeyden. As I wrote, I have been trying various combinations of the things you mention while I try to learn how to develop a Seam application, about JBoss and Hibernate.

            The idea is to have 2 separate databases; one to store the dvdstore business data only (my dvdstore hsqldb database) and the other, only for jBPM's use (my jBPM hsqldb database).

            For all EntityManger declarations in the java code I have added unitName="dvdDatadtabase" to the PersistenceContext annotation ( eg in the AcceptAction class I have

            @PersistenceContext(unitName="dvdDatabase",type=PersistenceContextType.EXTENDED)
            EntityManager em;
            
            ).

            I am running hsqldb in server mode (ie the jdbc driver and urls have been changed). I delete both databases manually, undeploy and then deploy the application (using the ant scripts which work perfectly well before I change the database settings). However, on successful deployment, my jBPM database has all the domain tables (ORDERS etc) and my dvdsore database has both sets of tables jBPM tables (ORDERS etc, plus, JBPM_EVENT etc).

            The key config I have added/changed (in bold in the config files below) are

            1 - In persistence.xml I have added a new persistence-unit name="dvdDatabasejBPM" pointing at the jBPM database

            2 - In dvd-ds.xml I have added a new local-tx-datasource with jndi-name dvdDatasourcejBPM

            3 - I have created jBPM.hibernate.cfg.xml, which is exactly the same as the hibernate.cfg.xml except have changed the connection.datasource property to java:/dvdDatasourcejBPM (I have not changed hibernate.cfg.xml)

            4 - I have added to jBPM.cfg.xml .

            Nothing else has changed and all the files are packaged up correctly in the ear and contained war and jar.

            Any ideas on what I am missing? Is there something I can read that tells me the relationships between all these files (and if settings in any of them take precedence over the other) and the differences between seam managed and other database settings?



            Here are my configuration files:
            --------------------------------------------------------
            persistence.xml
            <?xml version="1.0" encoding="UTF-8"?>
            <persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
             version="1.0">
             <persistence-unit name="dvdDatabase">
             <provider>org.hibernate.ejb.HibernatePersistence</provider>
             <jta-data-source>java:/dvdDatasource</jta-data-source>
             <properties>
             <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
             <property name="hibernate.cache.use_query_cache" value="true"/>
             <property name="hibernate.show_sql" value="true"/>
            
             <property name="hibernate.cache.provider_class"
             value="org.hibernate.cache.HashtableCacheProvider"/>
             </properties>
             </persistence-unit>
             <persistence-unit name="dvdDatabasejBPM">
             <provider>org.hibernate.ejb.HibernatePersistence</provider>
             <jta-data-source>java:/dvdDatasourcejBPM</jta-data-source>
             <properties>
             <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
             <property name="hibernate.cache.use_query_cache" value="true"/>
             <property name="hibernate.show_sql" value="true"/>
            
             <property name="hibernate.cache.provider_class"
             value="org.hibernate.cache.HashtableCacheProvider"/>
             </properties>
             </persistence-unit>
            </persistence>
            

            --------------------------------------------------------
            dvd-ds.xml

            <?xml version="1.0" encoding="UTF-8"?>
            
            <datasources>
             <local-tx-datasource>
             <jndi-name>dvdDatasource</jndi-name>
             <!--<connection-url>jdbc:hsqldb:${jboss.server.data.dir}${/}hypersonic${/}dvd</connection-url> -->
             <connection-url>
             jdbc:hsqldb:hsql://localhost/dvd_server
             </connection-url>
             <driver-class>org.hsqldb.jdbcDriver</driver-class>
             <user-name>sa</user-name>
             <password></password>
             </local-tx-datasource>
            
             <local-tx-datasource>
             <jndi-name>dvdDatasourcejBPM</jndi-name>
             <connection-url>
             jdbc:hsqldb:hsql://localhost/jBPM
             </connection-url>
             <driver-class>org.hsqldb.jdbcDriver</driver-class>
             <user-name>sa</user-name>
             <password></password>
             </local-tx-datasource>
            
            </datasources>

            --------------------------------------------------------
            jBPM.cfg.xml

            <jbpm-configuration>
            
             <jbpm-context>
             <string name="resource.hibernate.cfg.xml" value="jbpm.hibernate.cfg.xml" />
             <service name="persistence">
             <factory>
             <bean class="org.jbpm.persistence.db.DbPersistenceServiceFactory">
             <field name="isTransactionEnabled"><false/></field>
             </bean>
             </factory>
             </service>
             <service name="message" factory="org.jbpm.msg.db.DbMessageServiceFactory" />
             <service name="scheduler" factory="org.jbpm.scheduler.db.DbSchedulerServiceFactory" />
             <service name="logging" factory="org.jbpm.logging.db.DbLoggingServiceFactory" />
             <service name="authentication" factory="org.jbpm.security.authentication.DefaultAuthenticationServiceFactory" />
             </jbpm-context>
            
            </jbpm-configuration>


            --------------------------------------------------------
            jBPM.hibernate.cfg.xml

            <?xml version='1.0' encoding='utf-8'?>
            
             <!DOCTYPE hibernate-configuration PUBLIC
             "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
             "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
            
             <hibernate-configuration>
             <session-factory>
            
             <property name="show_sql">true</property>
             <property name="connection.datasource">java:/dvdDatasourcejBPM</property>
             <property name="transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>
             <property name="transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup</property>
             <property name="cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
             <property name="hbm2ddl.auto">create-drop</property>
             <!--property name="transaction.flush_before_completion">true</property-->
            
             <!-- ############################################ -->
             <!-- # mapping files with external dependencies # -->
             <!-- ############################################ -->
            
             <!-- following mapping file has a dependendy on -->
             <!-- 'bsh-{version}.jar'. -->
             <!-- uncomment this if you don't have bsh on your -->
             <!-- classpath. you won't be able to use the -->
             <!-- script element in process definition files -->
             <!--
             <mapping resource="org/jbpm/graph/action/Script.hbm.xml"/>
             -->
            
             <!-- following mapping files have a dependendy on -->
             <!-- 'jbpm-identity-{version}.jar', mapping files -->
             <!-- of the pluggable jbpm identity component. -->
             <!-- comment out the following 3 lines if you don't-->
             <!-- want to use the default jBPM identity mgmgt -->
             <!-- component -->
            
             <!--
             <mapping resource="org/jbpm/identity/User.hbm.xml"/>
             <mapping resource="org/jbpm/identity/Group.hbm.xml"/>
             <mapping resource="org/jbpm/identity/Membership.hbm.xml"/>
             -->
            
             <!-- ###################### -->
             <!-- # jbpm mapping files # -->
             <!-- ###################### -->
            
             <!-- hql queries and type defs -->
             <mapping resource="org/jbpm/db/hibernate.queries.hbm.xml" />
            
             <!-- graph.def mapping files -->
             <mapping resource="org/jbpm/graph/def/ProcessDefinition.hbm.xml"/>
             <mapping resource="org/jbpm/graph/def/Node.hbm.xml"/>
             <mapping resource="org/jbpm/graph/def/Transition.hbm.xml"/>
             <mapping resource="org/jbpm/graph/def/Event.hbm.xml"/>
             <mapping resource="org/jbpm/graph/def/Action.hbm.xml"/>
             <mapping resource="org/jbpm/graph/def/SuperState.hbm.xml"/>
             <mapping resource="org/jbpm/graph/def/ExceptionHandler.hbm.xml"/>
             <mapping resource="org/jbpm/instantiation/Delegation.hbm.xml"/>
            
             <!-- graph.node mapping files -->
             <mapping resource="org/jbpm/graph/node/StartState.hbm.xml"/>
             <mapping resource="org/jbpm/graph/node/EndState.hbm.xml"/>
             <mapping resource="org/jbpm/graph/node/ProcessState.hbm.xml"/>
             <mapping resource="org/jbpm/graph/node/Decision.hbm.xml"/>
             <mapping resource="org/jbpm/graph/node/Fork.hbm.xml"/>
             <mapping resource="org/jbpm/graph/node/Join.hbm.xml"/>
             <mapping resource="org/jbpm/graph/node/State.hbm.xml"/>
             <mapping resource="org/jbpm/graph/node/TaskNode.hbm.xml"/>
            
             <!-- context.def mapping files -->
             <mapping resource="org/jbpm/context/def/ContextDefinition.hbm.xml"/>
             <mapping resource="org/jbpm/context/def/VariableAccess.hbm.xml"/>
            
             <!-- taskmgmt.def mapping files -->
             <mapping resource="org/jbpm/taskmgmt/def/TaskMgmtDefinition.hbm.xml"/>
             <mapping resource="org/jbpm/taskmgmt/def/Swimlane.hbm.xml"/>
             <mapping resource="org/jbpm/taskmgmt/def/Task.hbm.xml"/>
             <mapping resource="org/jbpm/taskmgmt/def/TaskController.hbm.xml"/>
            
             <!-- module.def mapping files -->
             <mapping resource="org/jbpm/module/def/ModuleDefinition.hbm.xml"/>
            
             <!-- bytes mapping files -->
             <mapping resource="org/jbpm/bytes/ByteArray.hbm.xml"/>
            
             <!-- file.def mapping files -->
             <mapping resource="org/jbpm/file/def/FileDefinition.hbm.xml"/>
            
             <!-- scheduler.def mapping files -->
             <mapping resource="org/jbpm/scheduler/def/CreateTimerAction.hbm.xml"/>
             <mapping resource="org/jbpm/scheduler/def/CancelTimerAction.hbm.xml"/>
            
             <!-- graph.exe mapping files -->
             <mapping resource="org/jbpm/graph/exe/Comment.hbm.xml"/>
             <mapping resource="org/jbpm/graph/exe/ProcessInstance.hbm.xml"/>
             <mapping resource="org/jbpm/graph/exe/Token.hbm.xml"/>
             <mapping resource="org/jbpm/graph/exe/RuntimeAction.hbm.xml"/>
            
             <!-- module.exe mapping files -->
             <mapping resource="org/jbpm/module/exe/ModuleInstance.hbm.xml"/>
            
             <!-- context.exe mapping files -->
             <mapping resource="org/jbpm/context/exe/ContextInstance.hbm.xml"/>
             <mapping resource="org/jbpm/context/exe/TokenVariableMap.hbm.xml"/>
             <mapping resource="org/jbpm/context/exe/VariableInstance.hbm.xml"/>
             <mapping resource="org/jbpm/context/exe/variableinstance/ByteArrayInstance.hbm.xml"/>
             <mapping resource="org/jbpm/context/exe/variableinstance/DateInstance.hbm.xml"/>
             <mapping resource="org/jbpm/context/exe/variableinstance/DoubleInstance.hbm.xml"/>
             <mapping resource="org/jbpm/context/exe/variableinstance/HibernateLongInstance.hbm.xml"/>
             <mapping resource="org/jbpm/context/exe/variableinstance/HibernateStringInstance.hbm.xml"/>
             <mapping resource="org/jbpm/context/exe/variableinstance/LongInstance.hbm.xml"/>
             <mapping resource="org/jbpm/context/exe/variableinstance/NullInstance.hbm.xml"/>
             <mapping resource="org/jbpm/context/exe/variableinstance/StringInstance.hbm.xml"/>
            
             <!-- msg.db mapping files -->
             <mapping resource="org/jbpm/msg/Message.hbm.xml"/>
             <mapping resource="org/jbpm/msg/db/TextMessage.hbm.xml"/>
             <mapping resource="org/jbpm/command/ExecuteActionCommand.hbm.xml"/>
             <mapping resource="org/jbpm/command/ExecuteNodeCommand.hbm.xml"/>
             <mapping resource="org/jbpm/command/SignalCommand.hbm.xml"/>
             <mapping resource="org/jbpm/command/TaskInstanceEndCommand.hbm.xml"/>
            
             <!-- taskmgmt.exe mapping files -->
             <mapping resource="org/jbpm/taskmgmt/exe/TaskMgmtInstance.hbm.xml"/>
             <mapping resource="org/jbpm/taskmgmt/exe/TaskInstance.hbm.xml"/>
             <mapping resource="org/jbpm/taskmgmt/exe/PooledActor.hbm.xml"/>
             <mapping resource="org/jbpm/taskmgmt/exe/SwimlaneInstance.hbm.xml"/>
            
             <!-- scheduler.exe mapping files -->
             <mapping resource="org/jbpm/scheduler/exe/Timer.hbm.xml"/>
            
             <!-- logging mapping files -->
             <mapping resource="org/jbpm/logging/log/ProcessLog.hbm.xml"/>
             <mapping resource="org/jbpm/logging/log/MessageLog.hbm.xml"/>
             <mapping resource="org/jbpm/logging/log/CompositeLog.hbm.xml"/>
             <mapping resource="org/jbpm/graph/log/ActionLog.hbm.xml"/>
             <mapping resource="org/jbpm/graph/log/NodeLog.hbm.xml"/>
             <mapping resource="org/jbpm/graph/log/ProcessInstanceCreateLog.hbm.xml"/>
             <mapping resource="org/jbpm/graph/log/ProcessInstanceEndLog.hbm.xml"/>
             <mapping resource="org/jbpm/graph/log/SignalLog.hbm.xml"/>
             <mapping resource="org/jbpm/graph/log/TokenCreateLog.hbm.xml"/>
             <mapping resource="org/jbpm/graph/log/TokenEndLog.hbm.xml"/>
             <mapping resource="org/jbpm/graph/log/TransitionLog.hbm.xml"/>
             <mapping resource="org/jbpm/context/log/VariableLog.hbm.xml"/>
             <mapping resource="org/jbpm/context/log/VariableCreateLog.hbm.xml"/>
             <mapping resource="org/jbpm/context/log/VariableDeleteLog.hbm.xml"/>
             <mapping resource="org/jbpm/context/log/VariableUpdateLog.hbm.xml"/>
             <mapping resource="org/jbpm/context/log/variableinstance/ByteArrayUpdateLog.hbm.xml"/>
             <mapping resource="org/jbpm/context/log/variableinstance/DateUpdateLog.hbm.xml"/>
             <mapping resource="org/jbpm/context/log/variableinstance/DoubleUpdateLog.hbm.xml"/>
             <mapping resource="org/jbpm/context/log/variableinstance/HibernateLongUpdateLog.hbm.xml"/>
             <mapping resource="org/jbpm/context/log/variableinstance/HibernateStringUpdateLog.hbm.xml"/>
             <mapping resource="org/jbpm/context/log/variableinstance/LongUpdateLog.hbm.xml"/>
             <mapping resource="org/jbpm/context/log/variableinstance/StringUpdateLog.hbm.xml"/>
             <mapping resource="org/jbpm/taskmgmt/log/TaskLog.hbm.xml"/>
             <mapping resource="org/jbpm/taskmgmt/log/TaskCreateLog.hbm.xml"/>
             <mapping resource="org/jbpm/taskmgmt/log/TaskAssignLog.hbm.xml"/>
             <mapping resource="org/jbpm/taskmgmt/log/TaskEndLog.hbm.xml"/>
             <mapping resource="org/jbpm/taskmgmt/log/SwimlaneLog.hbm.xml"/>
             <mapping resource="org/jbpm/taskmgmt/log/SwimlaneCreateLog.hbm.xml"/>
             <mapping resource="org/jbpm/taskmgmt/log/SwimlaneAssignLog.hbm.xml"/>
            
             </session-factory>
             </hibernate-configuration>
            














            • 3. Re: Separate database for jBPM
              gavin.king

              Basically, the configuration of jBPM persistence is completely in the hibernate.cfg.xml file. So all you need to do is create a second datasource (jbpm-ds.xml), and point hibernate.cfg.xml to that.

              AFAIK you should not need to modify any components.xml or persistence.xml files.

              • 4. Re: Separate database for jBPM
                irvega

                That's done the trick, thanks.
                So if I understand correctly,
                1 - In the dvdstore app, hibernate.cfg.xml effects only jBPM. It has no impact on how the entity beans are persisted.
                2 - jboss-beans.xml is not relevant at all for the dvdstore example (I've deleted it with no apparent side-effects).
                3 - each deployed SEAM (with jBPM) application can provide its own jBPM database with a separate *-ds.xml (as long as it uses a unique jndi name).
                4 - the app-server (jboss/hibernate/seam ...) will try to run import.sql against all persistence-units that are loaded (?). This is good for my dvdstore database but no good for the jBPM database (throws an exception when it can't delete from one of the domain tables (ORDERLINES)

                • 5. Re: Separate database for jBPM
                  gavin.king

                  1. Right.
                  2. jboss-beans.xml is *always* for tests only
                  3. sure
                  4. um. probably ....

                  • 6. Re: Separate database for jBPM
                    irvega

                    Thanks Gavin.

                    • 7. Re: Separate database for jBPM
                      milh_cbt

                      I have 2 seam-jbpm application, both have jbpm-ds.xml point to deferent database. when I Start Jboss-app 4.2 and deploy those applications, jboss-app 42 only create 1 set of jbpm tables. why? when I use separate app server, both application work fine.
                      thanks

                      • 8. Re: Separate database for jBPM
                        pmuir

                        But what datasource are you pointing at in hibernate.cfg.xml?