数据迁移程序介绍
?
?
?HibernateDaoImpl提供了基本的数据库操作,OldDaoImpl和NewDaoImpl都继承自它。OldDaoImpl是对旧系统的数据操作DAO,通过setBaseDaoSessionFactory方法指定数据源;getEntityClass指定旧系统的对象类;getAll从start开始取count数量条记录。如果start<0则取全部记录,注意,如果实体没有名为id的属性,则需要重写这个方法,这是为性能考虑。
?TransactionSaveService是具有事务的批处理类,它会把分页内的所有对象放在一个事务内处理。
public long transData(BaseServiceImpl service, List oldList, boolean isUpdate) {
????? long processCount = 0; // 已经处理的记录数
?
????? for (int j = 0; j < oldList.size(); j++) {
??????? IdEntity src = (IdEntity) oldList.get(j);
??????? if (service.getOldDao().getEntityClass()!=null) {
?????????? src = (IdEntity) service.getOldDao().get(service.getOldDao().getEntityClass(), src.getId());
??????? }
?
??????? Object target = null;
??????? if (service.isNeedTransform()) {
?????????? target = service.getNewDao().getBySrcEntity(service.getEntityClass(), src);
?????????? // 如果新对象中已有记录且不是更新
?????????? if (target != null && !isUpdate) {
????????????? continue;
?????????? }
?????????? if (target == null) {
????????????? try {
???????????????? target = service.getEntityClass().newInstance();
????????????? } catch (Exception e) {
???????????????? e.printStackTrace();
????????????? }
?????????? }
?????????? if (target != null) {
????????????? service.transform(target, src);
????????????? save(service.getNewDao(), target);
?
????????????? processCount++;
?????????? }
??????? }
??????? service.afterTransform(target, src);
????? }
????? return processCount;
@Override
public void update (int startPage, int endPage, String startDate, String endDate) throws NmoException {
????? Logger.getLogger(this.getClass()).debug("Begin update by time transform!");
????? long beginTime = System.currentTimeMillis();
?
????? long processCount = 0; // 已经处理的记录数
????? for (int i = startPage; i <= endPage; i++) {
??????? List oldList = getOldDao().getAll(i, IDataTransferService.PageSize, startDate, endDate);
??????? if (oldList == null || oldList.isEmpty()) {
?????????? break;
??????? }
?
??????? Logger.getLogger(this.getClass()).debug(
????????????? "Processing ... Number(" + IDataTransferService.PageSize + "): " + i);
?
??????? processCount += getTransactionSaveService().transData(this, oldList, true);
????? }
?
????? long endTime = System.currentTimeMillis();
????? Logger.getLogger(this.getClass()).debug(
?????????? "End transform, total transform: " + processCount + " records, total cost: " + (endTime - beginTime)
???????????????? + "ms");
?? }
?
?
至此,数据迁移框架已经成形,我们只需要为每一个新系统实体编写对应的service类,newDao类和oldDao类。