OpenJWeb代码生成器增加乐观锁的生成
项目开发经常遇到这样的问题:
当两个人打开同一条记录的编辑页面,甲改了A字段保存,乙改了B字段保存,在没有并发控制的情况下,乙修改的数据会覆盖甲修改的数据,为了防止这种情况的发生,OpenJWeb代码生成器增加了乐观锁控制。
乐观锁字段采用record_version long型字段,下面以运费毛利设置表为例,目前平台生成的hibernate配置文件包含了乐观锁:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Mapping file autogenerated by OpenJWeb - Hibernate Tools
-->
<hibernate-mapping>
<class name="com.tzsoft.wl.entity.WlTransfeeConfig" table="wl_transfee_config" optimistic-lock="version">
<id name="pkId" type="java.lang.String">
<column name="pk_id" length="40" />
<generator class="assigned" />
</id>
<version name="recordVersion" column="record_version" type="java.lang.Long"/>
<property name="rowId" type="java.lang.String">
<column name="row_id" length="40" />
</property>
<property name="sortNo" type="java.lang.Long">
<column name="sort_no" />
</property>
<property name="createDt" type="java.lang.String">
<column name="create_dt" length="23" />
</property>
<property name="updateDt" type="java.lang.String">
<column name="update_dt" length="23" />
</property>
<property name="createUid" type="java.lang.String">
<column name="create_uid" length="32" />
</property>
<property name="updateUid" type="java.lang.String">
<column name="update_uid" length="32" />
</property>
<property name="dataFlg" type="java.lang.String">
<column name="data_flg" length="6" />
</property>
<property name="objName" type="java.lang.String">
<column name="obj_name" length="40" />
</property>
<property name="masterRowId" type="java.lang.String">
<column name="master_row_id" length="40" />
</property>
<property name="flowTransId" type="java.lang.String">
<column name="flow_trans_id" length="40" />
</property>
<property name="flowStatus" type="java.lang.String">
<column name="flow_status" length="16" />
</property>
<property name="unitCost1" type="java.lang.Double">
<column name="unit_cost1" precision="8" />
</property>
<property name="vehicleType" type="java.lang.String">
<column name="vehicle_type" length="40" />
</property>
<property name="unitCost2" type="java.lang.Double">
<column name="unit_cost2" precision="8" />
</property>
<!--append new column-->
</class>
</hibernate-mapping>
对应的实体类相应增加了recordVersion的声明和set、get方法:
private Long recordVersion;
public Long getRecordVersion() {
return this.recordVersion;
}
public void setRecordVersion(Long recordVersion) {
this.recordVersion = recordVersion;
}
在控制层的保存方法中要增加对并发锁异常的拦截,参考下面的异常拦截代码:
try
{
if(this.getEntityClassName().endsWith("Head"))
{
bizService.saveBill(this.getEditEntity(),this.getDetail(), request);
}
else
{
//logger.info("在控制层开始调用保存...");
service.saveOrUpdate(this.getEditEntity());
}
}
catch(Exception ex)
{
if(ex.toString().indexOf("org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException")>-1)
{
this.addActionError("在保存之前数据已经被其他人修改,请重新检索!!");
}
else
{
ex.printStackTrace();
this.addActionError("保存异常,异常信息:"+ex.toString());
}
return "error";
}
以后新生成的实体类都自动增加乐观锁字段。平台原有实体如果想增加并发控制,可参考上面的说明手工添加。
在项目开发中,OpenJWeb代码生成器通过增加乐观锁功能来解决多人同时编辑同一记录时的数据冲突问题。该功能通过记录版本号(record_version)来判断数据是否被他人修改,从而在保存数据时避免数据覆盖。同时提供了异常拦截机制,当检测到数据已被他人修改时,提示用户重新检索。此更新适用于新生成的实体类,并允许原有实体手动添加并发控制。
993

被折叠的 条评论
为什么被折叠?



