OpenJWeb快速开发平台自动创建基于事务的业务逻辑接口和实现类

迷途d书童 发布于 2012/03/09 12:19
阅读 171
收藏 0

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

 

 

 

 


原文链接:http://blog.csdn.net/baozhengw/article/details/4033329
加载中
返回顶部
顶部