public void updatePrivilege(Privilege pvlg) throws EntityExistException {
   updator.updateByIdColumns(pvlg);
   if (pvlg.getType() == Privilege.BUSINESS_PRIVILEGE) {
     businessPrivilegeTreeChanged = true;
   } else if (pvlg.getType() == Privilege.NON_ROLE_PRIVILEGE) {
     nonRolePrivilegeTreeChanged = true;
   }
 }
  public void movePrivilege(Privilege privilege, Privilege target, int newOrderNum) {
    try {
      if (privilege.getId() <= 0) {
        throw new RalasafeException("Cannot move reserved privilege.");
      }

      privilege = getPrivilege(privilege.getId());
      target = getPrivilege(target.getId());
      if (privilege.getType() != target.getType()) {
        throw new RalasafeException("Cannot move privilege out of the tree.");
      }
      if (target.getIsLeaf()) {
        throw new RalasafeException("Canot move privilege to a leaf node.");
      }
      if (privilege == target || isCascadeChild(privilege.getId(), target.getId())) {
        throw new RalasafeException("This move will produce a cycle.");
      }

      Collection children = getChildren(target);
      ArrayList list = new ArrayList();
      if (children != null) {
        list.addAll(children);
      }

      // If it still be a child of the original parent node
      if (privilege.getPid() == target.getId()) {
        list.remove(privilege);
      }

      privilege.setPid(target.getId());

      // reset orderNum(s), and update to db
      list.add(newOrderNum, privilege);
      for (int i = 0, size = list.size(); i < size; i++) {
        Privilege p = (Privilege) list.get(i);
        p.setOrderNum(i);

        updator.updateByIdColumns(p);
      }

      if (target.getType() == Privilege.BUSINESS_PRIVILEGE) {
        businessPrivilegeTreeChanged = true;
      } else if (target.getType() == Privilege.NON_ROLE_PRIVILEGE) {
        nonRolePrivilegeTreeChanged = true;
      }
    } catch (EntityExistException e) {
      throw new DBLevelException(e);
    }
  }