docs: public void executeUpdate(ClassDescriptor cld, Object obj) throws PersistenceBrokerException
      {
          if (logger.isDebugEnabled())
          {
              logger.debug("executeUpdate: " + obj);
          }
  
          // obj with nothing but key fields is not updated
          if (cld.getNonPkRwFields().length == 0)
          {
              return;
          }
  
          final StatementManagerIF sm = broker.serviceStatementManager();
          PreparedStatement stmt = null;
          // BRJ: preserve current locking values
          // locking values will be restored in case of exception
          ValueContainer[] oldLockingValues;
          oldLockingValues = cld.getCurrentLockingValues(obj);
          try
          {
              stmt = sm.getUpdateStatement(cld);
              if (stmt == null)
              {
                  logger.error("getUpdateStatement returned a null statement");
                  throw new PersistenceBrokerException("getUpdateStatement returned a null statement");
              }
  
              sm.bindUpdate(stmt, cld, obj);
              if (logger.isDebugEnabled())
                  logger.debug("executeUpdate: " + stmt);
  
              if ((stmt.executeUpdate() == 0) && cld.isLocking()) //BRJ
              {
                  /**
                   * Kuali Foundation modification -- 6/19/2009
                   */
              	String objToString = "";
              	try {
              		objToString = obj.toString();
              	} catch (Exception ex) {}
                  throw new OptimisticLockException("Object has been modified by someone else: " + objToString, obj);
                  /**
                   * End of Kuali Foundation modification
                   */
              }
  
              // Harvest any return values.
              harvestReturnValues(cld.getUpdateProcedure(), obj, stmt);
          }
          catch (OptimisticLockException e)
          {
              // Don't log as error
              if (logger.isDebugEnabled())
                  logger.debug(
                      "OptimisticLockException during the execution of update: " + e.getMessage(),
                      e);
              throw e;
          }
          catch (PersistenceBrokerException e)
          {
              // BRJ: restore old locking values
              setLockingValues(cld, obj, oldLockingValues);
  
              logger.error(
                  "PersistenceBrokerException during the execution of the update: " + e.getMessage(),
                  e);
              throw e;
          }
          catch (SQLException e)
          {
              final String sql = broker.serviceSqlGenerator().getPreparedUpdateStatement(cld).getStatement();
              throw ExceptionHelper.generateException(e, sql, cld, logger, obj);
          }
          finally
          {
              sm.closeResources(stmt, null);
          }
      }