OpenJweb快速开发平台在定义表的页面中增加了"是否创建业务逻辑类"的选项,当勾选这个选项后,平台自动生成针对此
表的业务逻辑接口和实现类,一般主明细表的主表应该勾选此选项,当然也可以所有表都生成对应的业务逻辑类.平台除了生成
java代码,还自动配置Spring的配置文件,并为新生成的类配置事务代理,下面是由平台生成的业务逻辑接口的源代码(接口默认提供一个删除多行的方法,如果需要别的接口,可在生成后的接口和实现类源文件中自己添加):
package org.openjweb.core.service;
import javax.servlet.http.HttpServletRequest;
public interface ICrmDistributionService
{
public String deleteByIds(String entityClass, String fieldName, String rowIds[], HttpServletRequest request) throws Exception;
public void setDbService(String serviceName);
public String getDbService();
}
下面是生成的业务逻辑实现类代码(渠道客户表的业务逻辑):
package org.openjweb.core.service.impl;
import org.apache.log4j.Logger;
import org.openjweb.core.service.BaseMasterDetailService;
import org.openjweb.core.service.ICrmDistributionService;
public class CrmDistributionServiceImpl extends BaseMasterDetailService implements ICrmDistributionService
{
private static final Logger logger = Logger.getLogger(CrmDistributionServiceImpl.class);
}
这个实现类很简单,deleteByIds方法的实现是写在抽象类BaseMasterDetailService里了,下面是抽象类的代码:
package org.openjweb.core.service;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.openjweb.core.entity.CommMasterDetailRel;
public abstract class BaseMasterDetailService
{
private static final Logger logger = Logger.getLogger( BaseMasterDetailService.class);
protected String dbService ="";
public String getDbService()
{
return this.dbService;
}
public void setDbService(String serviceName)
{
this.dbService = serviceName;
}
public String deleteByIds(String entityClass, String fieldName, String[] rowIds, HttpServletRequest request) throws Exception
{
String sMessage="";
//如果没有设置主外键,要分别删除主明细表
//如果设置了主外键,则只删除主表,如果数据库没设置级联,则需要开发者决定是否同时删除主明细表还是提示错误信息。
if(rowIds==null||rowIds.length==0)return "";
IDBSupportService service = (IDBSupportService)ServiceLocator.getBean(this.dbService);
String masterTableName="";//主表表名
String masterColName="";//主表字段名
Object obj = service.getJdbcTemplate().queryForObject("select table_name from comm_table_def where cls_name='"+entityClass+"'", String.class);
if(obj!=null)masterTableName=obj.toString();
for(int i=0;i<rowIds.length;i++)//页面上选中多行,逐行删除
{
//删除明细,这里混合使用hibernate和jdbctemplate有问题,所以全部使用jdbcTemplate
//从主明细关系表中检索主表对应哪些明细表,遍历明细表进行删除
List list = service.findListByFieldValue("org.openjweb.core.entity.CommMasterDetailRel", "masterCol", fieldName, true, "masterCol");
CommMasterDetailRel relEnt = null;
if(list!=null&&list.size()>0)
{
for(int j=0;j<list.size();j++)
{
relEnt = (CommMasterDetailRel)list.get(j);
String detailTableName="";//子表表名
String detailColName="";//子表字段名
detailTableName = relEnt.getDetailTable();
detailColName = relEnt.getDetailCol();
service.getJdbcTemplate().execute("delete from "+detailTableName+" where "+detailColName+"='"+rowIds[i]+"'");
}
}
//if(true) throw new Exception("test trans"); //这里抛出异常,则整个事务回滚
//删除主表
//service.getJdbcTemplate().execute("delete from hr_resume where row_id='"+rowIds[i]+"'");
service.getJdbcTemplate().execute("delete from "+masterTableName+" where row_id='"+rowIds[i]+"'");
//测试事务,如果有异常,事务失败!
//if(true) throw new Exception("删除失败!");
}
return sMessage;
}
}
在上面的抽象类里,从主明细表关系表中获取此表是否有子表,如果有子表,则删除子表记录,删除后再删除主表记录,当然在实际应用中主子表有可能建立了主外键级联删除,如果没有建主外键,则上面的操作先删除子表,后删除主表,如果中间有异常,则整个事务回滚.在上面的代码中没有事务处理的代码,这是因为事务管理是由Spring容器控制的,下面是平台生成的spring配置文件:
<!-- OpenJWeb create Service,don't delete this row -->
<bean id="ICrmDistributionService" parent="txProxyTemplate1">
<property name="target">
<bean class="org.openjweb.core.service.impl.CrmDistributionServiceImpl">
<property name="dbService" value="IDBSupportService3"/>
</bean>
</property>
</bean>
其中 parent="txProxyTemplate1">指明了一个事务代理:
<bean id="txProxyTemplate1" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="demoTxManager" />
</property>
<property name="transactionAttributes">
<props>
<!-- 如果下面的被注释掉,则方法内部第一次写数据库成功后下一步抛异常,数据库数据回提交 -->
<prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly,-Exception</prop>
</props>
</property>
</bean>
此事务代理指定update,insert,*等方法当出现Exception异常时回滚,*表示所有方法出现异常都回滚.
由于OpenJWeb实现了由平台生成业务逻辑类并自动配置 Spring配置文件,所以对于不是很熟悉Spring的朋友提供了很大的方便.在实际开发中如果需要实现更多的业务逻辑,可在生成的源文件中添加新的方法.
作者联系方式:
QQ:29803446
msn:baozhengw999@hotmail.com