public void testDom4jSave() {
    Session pojos = openSession();
    Transaction txn = pojos.beginTransaction();

    prepareTestData(pojos);

    org.hibernate.Session dom4j = pojos.getSession(EntityMode.DOM4J);

    Element stock = DocumentFactory.getInstance().createElement("stock");
    stock.addElement("tradeSymbol").setText("IBM");

    Element val = stock.addElement("currentValuation").addElement("valuation");
    val.appendContent(stock);
    val.addElement("valuationDate").setText(new java.util.Date().toString());
    val.addElement("value").setText("121.00");

    dom4j.save(Stock.class.getName(), stock);
    dom4j.flush();

    txn.rollback();

    pojos.close();

    assertTrue(!pojos.isOpen());
    assertTrue(!dom4j.isOpen());

    prettyPrint(stock);
  }
 // 根据指定的元素创建一个Document
 @SuppressWarnings("unchecked")
 private static Document createDocument(Element element) {
   Document document = DocumentHelper.createDocument();
   Element root = document.addElement(element.getName());
   List<Attribute> attrs = element.attributes(); // 添加element元素的属性到根元素结点
   if (attrs != null) {
     for (Attribute attr : attrs) {
       root.addAttribute(attr.getName(), attr.getValue());
     }
   }
   root.appendContent(element);
   return document;
 }
  /**
   * 获取单个对象属性的性能数据
   *
   * @param objId 对象ID
   * @param objattrId 对象属性ID
   * @param attrType 类型
   * @param fetchSize 获取性能数据的条数
   * @return 性能数据XML
   * @throws Exception 异常
   */
  public String getPerfDataByObjAttr(int objId, int objattrId, int attrType, int fetchSize)
      throws Exception {
    // 定义一个Document作为返回结果
    Document resultDoc =
        DocumentHelper.parseText(
            "<?xml version=\"1.0\" encoding=\"UTF-8\"?><DataSource></DataSource>");

    // 调用接口获取性能数据
    Map<Integer, List<QueryResult>> values =
        CollDataQuery.getInstance().query(objId, fetchSize, new int[] {objattrId});

    // 组装数据
    if (values != null && values.size() > 0) {
      Element ele = resultDoc.getRootElement().addElement("Data");
      ele.addAttribute("OBJATTR_ID", String.valueOf(objattrId));

      List<QueryResult> resultLst = values.get(objattrId);

      if (resultLst != null && resultLst.size() > 0) {
        List<String> arr = new ArrayList<String>();
        arr.add(String.valueOf(objattrId));
        List<ValueTableEntity> valueTables = getValueTableByObjAttrIds(arr);

        // 循环读取每个QueryResult对象,并转化为指定XML格式
        ele.appendContent(
            queryResultListToXml(
                    resultLst,
                    String.valueOf(objattrId),
                    "",
                    String.valueOf(fetchSize),
                    String.valueOf(attrType),
                    valueTables)
                .getRootElement());
      }
    }

    return resultDoc.asXML();
  }
  /**
   * 查询SNMP历史数据
   *
   * @param objId 对象ID
   * @param startTime 开始时间(单位是秒)
   * @param endTime 结束时间(单位是秒)
   * @param objAttrIds 对象属性id列表
   * @return 结果
   * @throws Exception 异常
   */
  public String querySNMPHistoryData(int objId, long startTime, long endTime, String objAttrIds)
      throws Exception {
    String result = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><DataSources></DataSources>";

    if (!StringUtil.isNullOrEmpty(objAttrIds)) {
      String[] arr = objAttrIds.split(",");

      Map<Integer, List<QueryResult>> values =
          CollDataQuery.getInstance()
              .query(objId, startTime, endTime, ArrayUtils.stringToIntArray(arr));

      if (values != null) {
        // 查询要格式化值的对象属性
        List<Map<String, String>> lst =
            new SqlQueryUtil()
                .getLst(
                    "SELECT A.OBJATTR_ID,A.ATTRIB_TYPE,B.VALUE_TYPE FROM BMP_OBJATTRIB A LEFT JOIN BMP_ATTRIBUTE B ON A.ATTRIB_ID = B.ATTRIB_ID WHERE B.VALUE_TYPE > 0 AND B.VALUE_TYPE IS NOT NULL AND A.OBJATTR_ID IN ("
                        + objAttrIds
                        + ")");

        // 查询枚举信息
        List<String> valueObjAttrArr = ArrayUtils.stringToStringArrayList(arr);
        List<ValueTableEntity> valueTables = getValueTableByObjAttrIds(valueObjAttrArr);

        // 组装
        Document result_doc = DocumentHelper.parseText(result);

        String objattrId;
        String attribType = "";
        String valueType = "";
        List<ValueTableEntity> valueLst;
        for (Map.Entry<Integer, List<QueryResult>> entry : values.entrySet()) {
          objattrId = entry.getKey().toString();

          Element ele = result_doc.getRootElement().addElement("Data");
          ele.addAttribute("OBJATTR_ID", objattrId);

          valueLst = new ArrayList<ValueTableEntity>();
          if (lst != null && lst.size() > 0 && valueTables.size() > 0) {
            for (Map<String, String> map : lst) {
              if (objattrId.equals(map.get("OBJATTR_ID"))) {
                attribType = map.get("ATTRIB_TYPE");
                valueType = map.get("VALUE_TYPE");

                for (ValueTableEntity entity : valueTables) {
                  if (valueType.equals(String.valueOf(entity.getValueType()))) {
                    valueLst.add(entity);
                  }
                }

                break;
              }
            }
          }

          // 循环读取每个QueryResult对象,并转化为指定XML格式
          ele.appendContent(
              queryResultListToXml(
                      entry.getValue(), entry.getKey().toString(), "", "", attribType, valueLst)
                  .getRootElement());
        }

        result = result_doc.asXML();
      }
    }

    return result;
  }
  /**
   * 获取其他类型的对象的性能数据
   *
   * @param objXml 固定界面的对象的XML
   * @param type 对象类型
   * @param objID 对象ID
   * @return 性能数据XML
   * @throws Exception 异常
   */
  public String getElseObjCollValue(String objXml, String type, int objID) throws Exception {
    // 定义一个Document作为返回结果
    Document result_doc =
        DocumentHelper.parseText(
            "<?xml version=\"1.0\" encoding=\"UTF-8\"?><DataSource></DataSource>");

    // 解析objXml,获取从哪些表获取哪些数据等信息
    Document doc = DocumentHelper.parseText(objXml);
    List list = doc.selectNodes("ElseObject/" + type + "/DataTable");
    if (list != null) {
      Iterator it = list.iterator();
      while (it.hasNext()) {
        // 解析要查询的表及数据条数
        Element tableEle = (Element) it.next();
        String table = tableEle.attribute("table").getValue();
        String collValueNum = tableEle.attribute("collValueNum").getValue();

        // 在结果Document的根节点下添加表节点
        Element ele = result_doc.getRootElement().addElement("DATA_TABLE");
        ele.addAttribute("TABLE_NAME", table);

        // DVB_C类型的对象属性与其他类型的查询方式不同
        // 获取最近的collValueNum个采集时间
        String cmd = "";
        if ("DVB_C".equals(type)) {
          cmd =
              sqlExecutor
                  .getSqlParser()
                  .getSelectCommandString(
                      table,
                      Integer.parseInt(collValueNum),
                      false,
                      "COLL_TIME",
                      null,
                      "ORDER BY COLL_TIME DESC",
                      new SqlCondition(
                          "FREQ_ID",
                          "SELECT FREQ_ID FROM NMP_OBJDVBCTS WHERE OBJ_ID=" + objID + "",
                          SqlLogicType.And,
                          SqlRelationType.In,
                          SqlParamType.UnKnow,
                          true));
        } else {
          cmd =
              sqlExecutor
                  .getSqlParser()
                  .getSelectCommandString(
                      table,
                      Integer.parseInt(collValueNum),
                      false,
                      "COLL_TIME",
                      null,
                      "ORDER BY COLL_TIME DESC",
                      new SqlCondition(
                          "OBJ_ID",
                          String.valueOf(objID),
                          SqlLogicType.And,
                          SqlRelationType.Equal,
                          SqlParamType.Numeric));
        }

        // 将采集时间存入List
        final List<String> timeList = new ArrayList<String>();
        DefaultDal.read(
            cmd,
            new IReadHandle() {
              @Override
              public void handle(ResultSet timeRS) throws Exception {
                while (timeRS.next()) {
                  timeList.add(timeRS.getString("COLL_TIME"));
                }
              }
            });

        // 针对每个采集时间,从指定的表中获取数据
        if (timeList != null && timeList.size() > 0) {
          for (int k = 0; k < timeList.size(); k++) {
            // 如果是第一条,添加最大时间
            if (k == 0) {
              ele.addAttribute("max_time", timeList.get(k));
            }

            Document coll = null;
            if ("DVB_C".equals(type)) {
              coll =
                  sqlExecutor.fill(
                      "SELECT * FROM "
                          + table
                          + " WHERE FREQ_ID IN (SELECT FREQ_ID FROM NMP_OBJDVBCTS WHERE OBJ_ID="
                          + String.valueOf(objID)
                          + ") AND COLL_TIME='"
                          + timeList.get(k)
                          + "'",
                      "DataTable",
                      table);
            } else {
              coll =
                  sqlExecutor.fill(
                      "SELECT * FROM "
                          + table
                          + " WHERE OBJ_ID="
                          + String.valueOf(objID)
                          + " AND COLL_TIME='"
                          + timeList.get(k)
                          + "'",
                      "DataTable",
                      table);
            }

            // 组装结果
            ele.appendContent(coll.getRootElement());
          }
        }
      }
    }

    return result_doc.asXML();
  }
  /**
   * 获取所有对象属性的性能数据 主要用于获取拓扑图中的性能数据和性能面板中的性能数据
   *
   * @param objXml 要获取性能数据的各对象属性及参数的XML
   * @return 返回性能数据XML
   * @throws Exception 异常
   */
  public String getObjAttrsPerfData(String objXml) throws Exception {
    // 用于组装返回结果
    Document result_doc =
        DocumentHelper.parseText(
            "<?xml version=\"1.0\" encoding=\"UTF-8\"?><DataSource></DataSource>");

    // 根据传递过来的XML获取要采集哪些对象属性的值
    Document doc = DocumentHelper.parseText(objXml);

    // 根据传过来的objXml组装QueryParam
    if (doc != null) {

      // 获取所有的Item,每个Item下是一个对象的所有要获取性能数据的对象属性相关参数
      List list = doc.selectNodes("/PerfObjects/Item");
      if (list != null) {
        Iterator it = list.iterator();
        if (it != null) {
          while (it.hasNext()) {
            Element itemEle = (Element) it.next();
            String objId = itemEle.attribute("objId").getValue();

            // 获取该对象下的所有要获取性能数据的对象属性相关参数
            List<Element> child = itemEle.elements("PerfObject");
            if (child != null && child.size() > 0) {
              List<QueryParam> para = new ArrayList<QueryParam>();
              List<String> valueObjAttrArr = new ArrayList<String>();

              // 组装QueryParam
              for (Element e : child) {
                String objAttrId = e.attribute("objAttrId").getValue();
                String attrType = e.attribute("attrType").getValue();
                String fetchSize = e.attribute("fetchSize").getValue();

                valueObjAttrArr.add(objAttrId);

                QueryParam qp = new QueryParam();
                qp.setObjId(Integer.parseInt(objId));
                qp.setObjAttrId(Integer.parseInt(objAttrId));
                qp.setAttrType(Integer.parseInt(attrType));
                qp.setFetchSize(Integer.parseInt(fetchSize));

                para.add(qp);
              }

              // 调用接口获取性能数据
              QueryParam[] arr = para.toArray(new QueryParam[para.size()]);
              Map<Integer, List<QueryResult>> values =
                  CollDataQuery.getInstance().query(Integer.valueOf(objId), arr);

              // 组装结果
              if (values != null && values.size() > 0) {
                // 查询要格式化值的对象属性
                List<Map<String, String>> lst =
                    new SqlQueryUtil()
                        .getLst(
                            "SELECT A.OBJATTR_ID,A.ATTRIB_TYPE,B.VALUE_TYPE FROM BMP_OBJATTRIB A LEFT JOIN BMP_ATTRIBUTE B ON A.ATTRIB_ID = B.ATTRIB_ID WHERE B.VALUE_TYPE > 0 AND B.VALUE_TYPE IS NOT NULL AND A.OBJATTR_ID IN ("
                                + StringUtils.join(valueObjAttrArr, ',')
                                + ")");

                // 查询枚举信息
                List<ValueTableEntity> valueTables = getValueTableByObjAttrIds(valueObjAttrArr);

                // 组装
                String attribType = "";
                String valueType = "";
                List<ValueTableEntity> valueLst;
                for (Element e : child) {
                  String objAttrId = e.attribute("objAttrId").getValue();
                  String objAttrName = e.attribute("objAttrName").getValue();
                  String bindId = e.attribute("bindId").getValue();
                  String index = e.attribute("index").getValue();
                  String fetchSize = e.attribute("fetchSize").getValue();

                  Element ele = result_doc.getRootElement().addElement("Data");
                  ele.addAttribute("bindId", bindId);
                  ele.addAttribute("index", index);
                  ele.addAttribute("objAttrId", objAttrId);
                  ele.addAttribute("objAttrName", objAttrName);

                  List<QueryResult> resultLst = values.get(Integer.valueOf(objAttrId));

                  // 判断是否需要格式化值
                  valueLst = new ArrayList<ValueTableEntity>();
                  if (lst != null && lst.size() > 0 && valueTables.size() > 0) {
                    for (Map<String, String> map : lst) {
                      if (objAttrId.equals(map.get("OBJATTR_ID"))) {
                        attribType = map.get("ATTRIB_TYPE");
                        valueType = map.get("VALUE_TYPE");

                        for (ValueTableEntity entity : valueTables) {
                          if (valueType.equals(String.valueOf(entity.getValueType()))) {
                            valueLst.add(entity);
                          }
                        }

                        break;
                      }
                    }
                  }

                  // 将结果转化为指定格式XML字符串
                  ele.appendContent(
                      queryResultListToXml(
                              resultLst, objAttrId, objAttrName, fetchSize, attribType, valueLst)
                          .getRootElement());
                }
              }
            }
          }
        }
      }
    }

    return result_doc.asXML();
  }
  /**
   * 获取某对象的某属性的性能数据,可能为多个对象属性
   *
   * @param objId 对象ID
   * @param attrId 属性ID
   * @param fetchSize 获取性能数据的条数
   * @return 性能数据XML
   * @throws Exception 异常
   */
  public String getPerfDataByObjAndAttrib(int objId, int attrId, int fetchSize) throws Exception {
    // 定义一个Document作为返回结果
    Document result_doc =
        DocumentHelper.parseText(
            "<?xml version=\"1.0\" encoding=\"UTF-8\"?><DataSource></DataSource>");

    // 先查询该对象该属性下所有的对象属性
    List<ObjAttribEntity> lst =
        ClassWrapper.wrapTrans(ObjAttribDal.class)
            .getByObjIdAndAttribId(objId, attrId, new Integer[] {1});

    if (lst != null && lst.size() > 0) {
      List<QueryParam> para = new ArrayList<QueryParam>();

      // 对所有对象属性组装QueryParam,并保存到List
      for (ObjAttribEntity entity : lst) {
        QueryParam qp = new QueryParam();
        qp.setObjId(objId);
        qp.setObjAttrId(entity.getObjAttrId());
        qp.setAttrType(entity.getAttribType());
        qp.setFetchSize(fetchSize);

        para.add(qp);
      }

      // 调用接口取性能数据
      QueryParam[] arr = para.toArray(new QueryParam[para.size()]);
      Map<Integer, List<QueryResult>> values =
          CollDataQuery.getInstance().query(Integer.valueOf(objId), arr);

      // 根据结果组装XML
      if (values != null && values.size() > 0) {
        // 获取该属性枚举信息
        List<String> attrIdArr = new ArrayList<String>();
        attrIdArr.add(String.valueOf(attrId));
        List<ValueTableEntity> valueTables = getValueTableByAttrIds(attrIdArr);

        // 组装
        for (ObjAttribEntity entity : lst) {
          String objattrId = String.valueOf(entity.getObjAttrId());
          String objattrName = String.valueOf(entity.getAttribType());

          Element ele = result_doc.getRootElement().addElement("Data");
          ele.addAttribute("OBJATTR_ID", objattrId);
          ele.addAttribute("OBJATTR_NAME", objattrName);

          List<QueryResult> resultLst = values.get(Integer.valueOf(objattrId));

          // 循环读取每个QueryResult对象,并转化为指定XML格式
          ele.appendContent(
              queryResultListToXml(
                      resultLst,
                      objattrId,
                      objattrName,
                      String.valueOf(fetchSize),
                      String.valueOf(entity.getAttribType()),
                      valueTables)
                  .getRootElement());
        }
      }
    }

    return result_doc.asXML();
  }