在Activiti中集成JPA(解决动态表单生成的大量数据)
2016-05-17 00:00
483 查看
1. 为何集成JPA
在《比较Activiti中三种不同的表单及其应用》一文中介绍了不同表单的特点以及表现形式,相信这是每个初学者都会面临表单类型的选择。如果选择了使用动态表单那么将面临一个比较“严峻”的问题——大数据量,我们知道动态表单的内容都保存在一张表中(ACT_HI_DETAIL),我们也清楚动态表单中每一个Field都会在该表中插入一条记录,假如一个流程共有20个字段,这个数据量大家可以计算一下,每天多少个流程实例,每个月、每年多少?
日积月累的大数据会影响系统的性能,尤其涉及到关联查询时影响更深,除了性能之外动态表单还有一个弊端那就是数据是以行的形式存储没有任何数据结构可言,流程运行中生成的数据很难被用于分析、查询,如何破解嘞?
2. 如何集成JPA
Activiti除了核心的Engine之外对企业现有的技术、平台、架构都有所支持,对于业务实体的持久化当然也会有所支持,那就是EJB的标准之一)——JPA,引擎把JPA的API引入到了内部,使用JPA功能的时候只需要把entityManagerFactory配置到引擎配置对象(参考:谈谈Activiti的引擎与引擎配置对象)即可。参考用户手册的JPA章节,介绍了引擎配置对象中的几个jpa有关的属性,如下:
jpaPersistenceUnitName: 使用持久化单元的名称(要确保该持久化单元在类路径下是可用的)。根据该规范,默认的路径是/META-INF/persistence.xml)。要么使用 jpaEntityManagerFactory 或者jpaPersistenceUnitName。
jpaEntityManagerFactory: 一个实现了javax.persistence.EntityManagerFactory的bean的引用。它将被用来加载实体并且刷新更新。要么使用jpaEntityManagerFactory 或者jpaPersistenceUnitName。
jpaHandleTransaction: 在被使用的EntityManager 实例上,该标记表示流程引擎是否需要开始和提交/回滚事物。当使用Java事物API(JTA)时,设置为false。
jpaCloseEntityManager: 该标记表示流程引擎是否应该关闭从 EntityManagerFactory获取的 EntityManager的实例。当EntityManager 是由容器管理的时候需要设置为false(例如 当使用并不是单一事物作用域的扩展持久化上下文的时候)。
2.1 配置持久化单元或者EntityManagerFactory
要在引擎中使用JPA需要提供EntityManagerFactory或者提供持久化单元名称(引擎会自动查找最终获取到EntityManagerFactory对象),在使用的时候可以根据自己的实际情况进行选择,在kft-activiti-demo中使用了jpaEntityManagerFactory属性注入EntityManagerFactory对象的方式。2.2 Standalone模式的JPA配置
?1 2 3 4 |
2.3 Spring(托管)模式的JPA配置
?1 2 3 4 |
3. 实例分析
在最新版本(1.10)的kft-activiti-demo中添加了JPA演示,大家可以从Github上下载源码查看源码。![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/17/7bf1a2d3b67a951136636d2984ec7eae.jpg)
3.1 相关说明
流程定义文件:leave-jpa.bpmn实体文件:me.kafeitu.demo.activiti.entity.oa.LeaveJpaEntity
实体管理器:me.kafeitu.demo.activiti.service.oa.leave.LeaveEntityManager
3.2 创建实体
在流程定义文件中定义了一个流程的start类型监听器:?
1 2 3 |
下面是LeaveEntityManager.java的代码:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
3.3 在流程中更改实体的值
当部门领导或者人事审批节点完成时需要把审批结果更新到LeaveJpaEntity属性中(即更新表LEAVE_JPA),所以在这两个任务上添加一个complete类型的监听器,如下所示:?
1 2 3 4 5 6 7 8 9 10 11 |
3.4 流程结束后删除表单数据
熟悉Activiti表的应该知道表单数据会保存在表ACT_HI_DETAIL中,特性是字段TYPE_字段的值为FormProperty,我们只要根据流程实例ID过滤删除记录就可以清理掉已经结束流程的表单数据。在最新版本的Demo中(1.10版本)添加了一个类用来执行SQL:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
3.5 已知问题(未解决)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/17/c50c6c9f1ce3447b05d5124cd59dd609.jpg)
图中的三条数据因为是在销假任务完成后设置的,不知道是不是引擎的Bug导致插入这三个表单属性比调用流程结束监听器还晚(从引擎的日志中可以分析出来)导致这三条记录不能被删除,因为在删除的时候这三条数据还没有插入到数据库。
这个问题后面会继续跟踪,解决了会在这里更新!!!
相关文章推荐
- 【AngularJS】学习笔记
- 域名解析原理及其解析方式
- 用Javascript(js)进行HTML转义工具(处理特殊字符显示)
- MULE ESB webservice jms服务
- RGB颜色查询对照表
- JSTL标签 参考手册(手动整理)
- 【MyBatis】实现批量删除,比较通用
- tomcat 和 jboss的热部署(热发布)问题
- Java敏感字符串处理工具类(河蟹专用)
- 利用Javamail接收QQ邮箱和Gmail邮箱
- js获取验证码倒计时如何实现
- Linux下Tomcat的安装配置
- 用Spring MVC优雅的实现301跳转
- Java NIO Socket通信
- html展示 pdf 利器
- Windows 下 Apache HTTP Server 安装、配置以及与 Tomcat 的整合(附图)
- Ajax实现原理详解
- Javascript - 获取Json结构的表单数据
- Sitemesh 3 的使用及配置
- StringBuilder与StringBuffer的区别