spring+hibernate+jbpm

本文分享了Spring、Hibernate和JBPM的整合实践,详细介绍了配置文件设置,包括数据库连接、事务管理、流程定义及部署等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  最近对spring+hibernate+jbpm进行了整合,现在把主要配置文件晒到这里,供大家参考.

 

   appDbContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
   "http://www.springframework.org/dtd/spring-beans.dtd">
<!-- 
	DB服务初始化
-->

<beans>
	<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
		<list>
			<value>jdbc.properties</value>
		</list>
		</property>
	</bean>
	
	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName">
			<value>${database.driver}</value>
		</property>
		<property name="url">
			<value>${database.url}</value>
		</property>
		<property name="username">
			<value>${database.username}</value>
		</property>
		<property name="password">
			<value>${database.password}</value>
		</property>
	</bean>
	
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource">
			<ref local="dataSource"/>
		</property>
		
		<property name="mappingLocations"><!-- mappingDirectoryLocations -->
		<list>
			<value>${package.springframwork.url}</value>
			<value>${package.synflow.url}</value>
		</list>
		</property>
		
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">
					${hibernate.dialect}
				</prop>
				<prop key="hibernate.show_sql">
					true
				</prop>
			</props>
		</property>
	</bean>
	
	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory">
			<ref local="sessionFactory"/>
		</property>
	</bean>
	
	<bean id="baseServiceproxyBean" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true">
		<property name="transactionManager">
			<ref local="transactionManager"/>
		</property>
		<property name="transactionAttributes">
			<props>
				<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
				<prop key="update*">PROPAGATION_REQUIRED</prop>
				<prop key="delete*">PROPAGATION_REQUIRED</prop>
				<prop key="save*">PROPAGATION_REQUIRED</prop>
				<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
			</props>
		</property>
	</bean>

</beans>

 

   appDaoContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
	<bean id="dao"
		class="org.springframwork.orm.hibernate.dao.impl.DaoImpl">
		<property name="sessionFactory">
			<ref bean="sessionFactory" />
		</property>
	</bean>		

	<bean id="userDao"
		class="org.springframwork.orm.hibernate.dao.impl.UserDaoImpl">
		<property name="sessionFactory">
			<ref bean="sessionFactory" />
		</property>	
	</bean>
</beans>

 

 

   appServiceContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
   "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
	<!--测试Service 操作 -->

	<bean id="userServiceTarget"
		class="org.springframwork.web.service.impl.UserServiceImpl">
		<property name="userDao">
			<ref bean="userDao" />
		</property>
	</bean>

	<bean id="userService" parent="baseServiceproxyBean"  >
		<property name="target">
			<ref local="userServiceTarget" />
		</property>
	</bean>
	
</beans>

 

   jbpm.cfg.xml

<jbpm-configuration>

  <!-- 
    This configuration is used when there is no jbpm.cfg.xml file found in the 
    root of the classpath.  It is a very basic configuration without persistence
    and message services.  Only the authorization service installed.
    You can parse and create processes, but when you try to use one of the 
    unavailable services, you'll get an exception.
  -->
  
  <jbpm-context>
    <!--  <service name="persistence" factory="org.jbpm.persistence.db.DbPersistenceServiceFactory" />-->
    <!-- 解决每次启动重新发布流程问题 -->
    <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>

  <!-- configuration resource files pointing to default configuration files in jbpm-{version}.jar -->
  <!-- <string name="resource.hibernate.cfg.xml" value="hibernate.cfg.xml" /> -->
  <string name="resource.business.calendar" value="org/jbpm/calendar/jbpm.business.calendar.properties" />
  <string name="resource.default.modules" value="org/jbpm/graph/def/jbpm.default.modules.properties" />
  <string name="resource.converter" value="org/jbpm/db/hibernate/jbpm.converter.properties" />
  <string name="resource.action.types" value="org/jbpm/graph/action/action.types.xml" />
  <string name="resource.node.types" value="org/jbpm/graph/node/node.types.xml" />
  <string name="resource.parsers" value="org/jbpm/jpdl/par/jbpm.parsers.xml" />
  <string name="resource.varmapping" value="org/jbpm/context/exe/jbpm.varmapping.xml" />

  <long   name="jbpm.msg.wait.timout" value="5000" singleton="true" />
  <int    name="jbpm.byte.block.size" value="1024" singleton="true" />
  <string name="mail.smtp.host" value="localhost" />
  <bean   name="jbpm.task.instance.factory" class="org.jbpm.taskmgmt.impl.DefaultTaskInstanceFactoryImpl" singleton="true" />
  <bean   name="jbpm.variable.resolver" class="org.jbpm.jpdl.el.impl.JbpmVariableResolver" singleton="true" />
  <bean   name="jbpm.mail.address.resolver" class="org.jbpm.identity.mail.IdentityAddressResolver" singleton="true" />

</jbpm-configuration>

 

    jbpmContext.xml 这里注释到了自动发布流程

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
   "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>

	<!-- reading jBPM process definitions -->
	<bean id="websaleWorkflow"
		class="org.springmodules.workflow.jbpm31.definition.ProcessDefinitionFactoryBean">
		<property name="definitionLocation"
			value="processdefinition.xml" />
	</bean> 
	
	<!-- jBPM configuration-->
	<bean id="jbpmConfiguration"
		class="org.springmodules.workflow.jbpm31.LocalJbpmConfigurationFactoryBean">
		<property name="sessionFactory" ref="sessionFactory" />
		<property name="configuration" value="classpath:jbpm.cfg.xml" />
		<!--此处屏蔽,就可以避免每次启动服务,都初始化数据
		<property name="processDefinitions">
			<list>
				<ref local="websaleWorkflow" />
			</list>
		</property>
		 -->
		<property name="createSchema" value="false" />
	</bean>
	
	<!-- jBPM template -->
	<bean id="jbpmTemplate"
		class="org.springmodules.workflow.jbpm31.JbpmTemplate">
		<constructor-arg index="0" ref="jbpmConfiguration" />
		<!-- 
		<constructor-arg index="1" ref="websaleWorkflow" />
		 -->
	</bean>
</beans>

 

    jbpmDaoContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
	<bean id="jbpmDao"
		class="org.springframwork.jbpm.orm.hibernate.dao.impl.JbpmDaoImpl">
		<property name="jbpmTemplate">
			<ref bean="jbpmTemplate"/>
		</property>
	</bean>
</beans>

 

   jdbc.properties

#database.url=jdbc:oracle:thin:@localhost:1521:exebase
#database.driver=oracle.jdbc.driver.OracleDriver
#database.username=scott
#database.password=tiger

database.url=jdbc:microsoft:sqlserver://88.16.50.155:1433;DatabaseName=HibernateDb
database.driver=com.microsoft.jdbc.sqlserver.SQLServerDriver
database.username=sa
database.password=sa
package.springframwork.url=classpath*:/org/springframwork/orm/hibernate/po/*.hbm.xml
package.synflow.url=classpath*:/org/jbpm/**/*.hbm.xml
hibernate.dialect=org.hibernate.dialect.SQLServerDialect

   

    processdefinition.xml

<?xml version="1.0" encoding="GBK"?>
<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="day">
	<!-- 申请 -->
	<start-state name="request">
		<task>
			<controller>
				<variable name="name" />
				<variable name="day" />
				<variable name="note" />
			</controller>
		</task>
		<!-- 流程转向 -->
		<transition name="to_confirm" to="confirm">
			<action name="requestAction" class="org.springframwork.jbpm.web.action.RequestAction">
				<reason>我要请假</reason>
			</action>
		</transition>
	</start-state>

	<!-- 审批 -->
	<state name="confirm">
		<transition name="to_end" to="end">
			<action name="finishAction" class="org.springframwork.jbpm.web.action.ConfirmAction" />
		</transition>
	</state>
	
	<!-- 结束 -->
	<end-state name="end" />

</process-definition>

 

  JbpmDao.java

package org.springframwork.jbpm.orm.hibernate.dao;

import org.jbpm.graph.exe.ProcessInstance;

/**
 * 
 * @author niedashun
 *
 */
public interface JbpmDao {
	/**
	 * 1
	 * 产生工作流实例
	 * @param processDefinitionID
	 * @return
	 */
	public ProcessInstance saveProcessInstance(final long processDefinitionID);
	
	/**
	 * 2
	 * 发布流程
	 * @return
	 */
	public Object DeployProcess();
	
	/**
	 * 3
	 * 创建一个流程实例
	 * @param processDefName  流程定义名字
	 * @param filedstr        "argname1=argValue1,argName2=argValue2"   
	 * @return  ProcessInstance
	 */
	public ProcessInstance createProcessInstance(final String processDefName,final String filedstr);	
	
	/**
	 * 4
	 * 根据流程实例id查找流程实例
	 * @param id                 流程实例id
	 * @return ProcessInstance   流程实例
	 */
	public ProcessInstance findProcessInstance(final long id);
	
	/**
	 * 5
	 * 根据流程实例id,审批流程
	 * @param id               流程实例id
	 * @param filedstr         "argname1=argValue1,argName2=argValue2"  
	 * @return ProcessInstance
	 */
	public ProcessInstance  approvalProcess(final long id,final String filedstr);	
	
	/**
	 * 6
	 * 根据流程实例id,判断流程是否已经结束
	 * @param id              流程实例id
	 * @param tag             流程结束标志
	 * @return Boolean        true表示已经结束
	 */
	public Boolean checkProcessIsEnd(final long id,final String tag);

}

 

 

  JbpmDaoImpl.java

package org.springframwork.jbpm.orm.hibernate.dao.impl;

import java.io.InputStream;

import org.jbpm.JbpmContext;
import org.jbpm.JbpmException;
import org.jbpm.context.exe.ContextInstance;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.springframwork.jbpm.orm.hibernate.dao.JbpmDao;
import org.springmodules.workflow.jbpm31.JbpmCallback;
import org.springmodules.workflow.jbpm31.JbpmTemplate;

public class JbpmDaoImpl implements JbpmDao {
	private JbpmTemplate jbpmTemplate;

	public void setJbpmTemplate(JbpmTemplate jbpmTemplate) {
		this.jbpmTemplate = jbpmTemplate;
	}

	public ProcessInstance saveProcessInstance(final long processDefinitionID) {
		return (ProcessInstance) jbpmTemplate.execute(new JbpmCallback() {
			public Object doInJbpm(JbpmContext context) {
				ProcessDefinition processDefinition = context.getGraphSession()
						.loadProcessDefinition(processDefinitionID);
				ProcessInstance processInstance = new ProcessInstance(
						processDefinition);
				context.save(processInstance);
				return processInstance;
			}
		});
	}

	public Object DeployProcess() {
		return jbpmTemplate.execute(new JbpmCallback() {
			public Object doInJbpm(JbpmContext context) {
				InputStream is = JbpmDaoImpl.class.getClassLoader()
						.getResourceAsStream("processdefinition.xml");
				ProcessDefinition processDefinition = ProcessDefinition
						.parseXmlInputStream(is);
				context.deployProcessDefinition(processDefinition);
				return null;
			}
		});
	}

	public ProcessInstance createProcessInstance(final String processDefName,final String filedstr) {
		return (ProcessInstance) jbpmTemplate.execute(new JbpmCallback() {
			public Object doInJbpm(JbpmContext context) throws JbpmException {
				// TODO Auto-generated method stub
				ProcessDefinition processDefinition = context.getGraphSession().findLatestProcessDefinition(processDefName);
				// 创建一个新流程
				ProcessInstance pi = processDefinition.createProcessInstance();
				// 取得流程的数据环境
				ContextInstance ci = pi.getContextInstance();
				// 创建一张请假单
				String[] sf=filedstr.split(",");
				for(int i=0;i<sf.length;i++){
					String[] s=sf[i].split("=");
					ci.setVariable(s[0],s[1]);
				}
				// 申请结束,转到下一个流程结点
				pi.signal();
				return pi;
			}
		});
	}
	

	public ProcessInstance findProcessInstance(final long id) {
		return (ProcessInstance) jbpmTemplate.execute(new JbpmCallback() {
			public Object doInJbpm(JbpmContext context) throws JbpmException {
				// TODO Auto-generated method stub
				ProcessInstance processInstance = context.getGraphSession().loadProcessInstance(id);
				return processInstance;
			}
		});
	}
	
	
	public ProcessInstance  approvalProcess(final long id,final String filedstr){
		return (ProcessInstance) jbpmTemplate.execute(new JbpmCallback() {
			public Object doInJbpm(JbpmContext context) throws JbpmException {
				// TODO Auto-generated method stub
				ProcessInstance pi = context.getGraphSession().loadProcessInstance(id);
				// 取得流程的数据环境
				ContextInstance ci = pi.getContextInstance();	
				// 创建一张请假单
				String[] sf=filedstr.split(",");
				for(int i=0;i<sf.length;i++){
					String[] s=sf[i].split("=");
					ci.setVariable(s[0],s[1]);
				}
				// 申请结束,转到下一个流程结点
				pi.signal();
				return pi;
			}
		});		
	}
	
	
	public Boolean checkProcessIsEnd(final long id,final String tag) {
		return (Boolean) jbpmTemplate.execute(new JbpmCallback() {
			public Object doInJbpm(JbpmContext context) throws JbpmException {
				// TODO Auto-generated method stub
				boolean t=false;
				ProcessInstance processInstance = context.getGraphSession().loadProcessInstance(id);
				if(tag==processInstance.getRootToken().getNode().getName()||tag.equals(processInstance.getRootToken().getNode().getName())){
					t=true;
				}
				return new Boolean(t);
			}
		});
	}
	
}

 

  如果大家有需要,请向我索取.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值