/** Updates a single row in the producto table. */
  public void update(ProductoPk pk, Producto dto) throws ProductoDaoException {
    long t1 = System.currentTimeMillis();
    // declare variables
    final boolean isConnSupplied = (userConn != null);
    Connection conn = null;
    PreparedStatement stmt = null;

    try {
      // get the user-specified connection or get a connection from the ResourceManager
      conn = isConnSupplied ? userConn : ResourceManager.getConnection();

      StringBuffer sql = new StringBuffer();
      sql.append("UPDATE " + getTableName() + " SET ");
      boolean modified = false;
      if (dto.isIdProductoModified()) {
        if (modified) {
          sql.append(", ");
        }

        sql.append("ID_PRODUCTO=?");
        modified = true;
      }

      if (dto.isNombreProductoModified()) {
        if (modified) {
          sql.append(", ");
        }

        sql.append("NOMBRE_PRODUCTO=?");
        modified = true;
      }

      if (dto.isPrecioModified()) {
        if (modified) {
          sql.append(", ");
        }

        sql.append("PRECIO=?");
        modified = true;
      }

      if (dto.isImagenModified()) {
        if (modified) {
          sql.append(", ");
        }

        sql.append("IMAGEN=?");
        modified = true;
      }

      if (dto.isCantidadModified()) {
        if (modified) {
          sql.append(", ");
        }

        sql.append("CANTIDAD=?");
        modified = true;
      }

      if (dto.isActivoModified()) {
        if (modified) {
          sql.append(", ");
        }

        sql.append("ACTIVO=?");
        modified = true;
      }

      if (dto.isFechaCreacionModified()) {
        if (modified) {
          sql.append(", ");
        }

        sql.append("FECHA_CREACION=?");
        modified = true;
      }

      if (dto.isUsuarioCreacionModified()) {
        if (modified) {
          sql.append(", ");
        }

        sql.append("USUARIO_CREACION=?");
        modified = true;
      }

      if (dto.isFechaUltimaModificacionModified()) {
        if (modified) {
          sql.append(", ");
        }

        sql.append("FECHA_ULTIMA_MODIFICACION=?");
        modified = true;
      }

      if (dto.isUsuarioUltimaModificacionModified()) {
        if (modified) {
          sql.append(", ");
        }

        sql.append("USUARIO_ULTIMA_MODIFICACION=?");
        modified = true;
      }

      if (dto.isCategoriaIdCategoriaModified()) {
        if (modified) {
          sql.append(", ");
        }

        sql.append("CATEGORIA_ID_CATEGORIA=?");
        modified = true;
      }

      if (dto.isCatalogoIdCatalogoModified()) {
        if (modified) {
          sql.append(", ");
        }

        sql.append("CATALOGO_ID_CATALOGO=?");
        modified = true;
      }

      if (!modified) {
        // nothing to update
        return;
      }

      sql.append(" WHERE ID_PRODUCTO=?");
      if (logger.isDebugEnabled()) {
        logger.debug("Executing " + sql.toString() + " with values: " + dto);
      }

      stmt = conn.prepareStatement(sql.toString());
      int index = 1;
      if (dto.isIdProductoModified()) {
        stmt.setString(index++, dto.getIdProducto());
      }

      if (dto.isNombreProductoModified()) {
        stmt.setString(index++, dto.getNombreProducto());
      }

      if (dto.isPrecioModified()) {
        stmt.setDouble(index++, dto.getPrecio());
      }

      if (dto.isImagenModified()) {
        super.setBlobColumn(stmt, index++, dto.getImagen());
      }

      if (dto.isCantidadModified()) {
        if (dto.isCantidadNull()) {
          stmt.setNull(index++, java.sql.Types.FLOAT);
        } else {
          stmt.setFloat(index++, dto.getCantidad());
        }
      }

      if (dto.isActivoModified()) {
        stmt.setShort(index++, dto.getActivo());
      }

      if (dto.isFechaCreacionModified()) {
        stmt.setTimestamp(
            index++,
            dto.getFechaCreacion() == null
                ? null
                : new java.sql.Timestamp(dto.getFechaCreacion().getTime()));
      }

      if (dto.isUsuarioCreacionModified()) {
        stmt.setString(index++, dto.getUsuarioCreacion());
      }

      if (dto.isFechaUltimaModificacionModified()) {
        stmt.setTimestamp(
            index++,
            dto.getFechaUltimaModificacion() == null
                ? null
                : new java.sql.Timestamp(dto.getFechaUltimaModificacion().getTime()));
      }

      if (dto.isUsuarioUltimaModificacionModified()) {
        stmt.setString(index++, dto.getUsuarioUltimaModificacion());
      }

      if (dto.isCategoriaIdCategoriaModified()) {
        stmt.setInt(index++, dto.getCategoriaIdCategoria());
      }

      if (dto.isCatalogoIdCatalogoModified()) {
        stmt.setInt(index++, dto.getCatalogoIdCatalogo());
      }

      stmt.setString(index++, pk.getIdProducto());
      int rows = stmt.executeUpdate();
      reset(dto);
      long t2 = System.currentTimeMillis();
      if (logger.isDebugEnabled()) {
        logger.debug(rows + " rows affected (" + (t2 - t1) + " ms)");
      }

    } catch (Exception _e) {
      logger.error("Exception: " + _e.getMessage(), _e);
      throw new ProductoDaoException("Exception: " + _e.getMessage(), _e);
    } finally {
      ResourceManager.close(stmt);
      if (!isConnSupplied) {
        ResourceManager.close(conn);
      }
    }
  }