package com.nis.web.service; import java.util.List; import org.springframework.transaction.annotation.Transactional; import com.nis.domain.TreeEntity; import com.nis.exceptions.ServiceException; import com.nis.util.Reflections; import com.nis.util.StringUtil; import com.nis.util.StringUtils; import com.nis.web.dao.TreeDao; /** * Service基类 * @author ThinkGem * @version 2014-05-16 */ public abstract class TreeService, T extends TreeEntity> extends CrudService { public void save(T entity) { @SuppressWarnings("unchecked") Class entityClass = Reflections.getClassGenricType(getClass(), 1); // 如果没有设置父节点,则代表为跟节点,有则获取父节点实体 if (entity.getParent() == null || StringUtil.isEmpty(entity.getParentId()) || "0".equals(entity.getParentId())){ entity.setParent(null); }else{ entity.setParent(super.get(entity.getParentId())); } if (entity.getParent() == null){ T parentEntity = null; try { parentEntity = entityClass.getConstructor(Long.class).newInstance(0l); } catch (Exception e) { throw new ServiceException(e); } entity.setParent(parentEntity); entity.getParent().setParentIds(StringUtils.EMPTY); } // 获取修改前的parentIds,用于更新子节点的parentIds String oldParentIds = entity.getParentIds(); // 设置新的父节点串 entity.setParentIds(entity.getParent().getParentIds()+entity.getParent().getId()+","); // 保存或更新实体 super.save(entity); // 更新子节点 parentIds T o = null; try { o = entityClass.newInstance(); } catch (Exception e) { throw new ServiceException(e); } o.setParentIds("%,"+entity.getId()+",%"); List list = dao.findByParentIdsLike(o); for (T e : list){ if (e.getParentIds() != null && oldParentIds != null){ e.setParentIds(e.getParentIds().replace(oldParentIds, entity.getParentIds())); preUpdateChild(entity, e); dao.updateParentIds(e); } } } /** * 预留接口,用户更新子节前调用 * @param childEntity */ protected void preUpdateChild(T entity, T childEntity) { } }