Dorado 9 : 6.3.2 准备后台服务

步骤1:在com.bstek.dorado.sample.standardlesson.service.CompanyService类中增加保存方法,代码如下:

package com.bstek.dorado.sample.standardlesson.service;
import java.util.Collection;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import com.bstek.dorado.annotation.DataProvider;
import com.bstek.dorado.annotation.DataResolver;
import com.bstek.dorado.sample.standardlesson.dao.SlCompanyDao;
import com.bstek.dorado.sample.standardlesson.entity.SlCompany;
@Component
public class CompanyService{
    @Resource
    private SlCompanyDao slcompanyDao;
    
    @DataProvider
    public Collection<SlCompany> getCompany(){
        return slcompanyDao.getAll();
    }
    
    @DataResolver
    @Transactional
    public void saveCompany(Collection<SlCompany> slcompanys){
        slcompanyDao.persistEntities(slcompanys);
    }
}

其中用了两个标记:@DataResolver是用于声明这个Java方法为一个DataResolver方法,可以被客户端的DataResolver技术所调用,@Transactional是Spring中提供的一个事务性的标记声明。

note

有时候可能会忘记加入@Transactional注解,带来的结果就是修改的数据无法commit进行持久化。

我们发现在saveCompany方法中执行了其父类hibernateDao的persistEntities方法,我们看看这个方法具体做了什么:

@SuppressWarnings("unchecked")
public int persistEntities(Collection<T> entities) {
    int i = 0;
    for (Object entity : EntityUtils.getIterable(entities,
            FilterType.DELETED)) {
        delete((T) entity);
        i++;
    }
    for (Object entity : EntityUtils.getIterable(entities,
            FilterType.MODIFIED)) {
        save((T) entity);
        i++;
    }
    for (Object entity : EntityUtils
            .getIterable(entities, FilterType.MOVED)) {
        save((T) entity);
        i++;
    }
    for (Object entity : EntityUtils.getIterable(entities, FilterType.NEW)) {
        save((T) entity);
        i++;
    }
    return i;
}

可以看到,在这个方法中,根据提交到后台数据不同的状态,执行了不同的持久化操作,并返回操作过的数据量。