public static void store(SmartObject so)
        throws SmartObjectException {
  try {
    boolean addedProperty = false;
    StringBuffer sb = new StringBuffer("UPDATE ");
    sb.append(so.getTableName());
    sb.append(" SET ");
    PropertyDescriptor[] props =
            Introspector.getBeanInfo(so.getClass()).getPropertyDescriptors();
    for (int i = 0; i < props.length; i++) {
      String prop = getPropertyName(props[i]);
      String methodName = getReadMethodName(props[i]);
      if (!methodName.startsWith("java.") && 
              !methodName.startsWith("com.neo.smartobjects.SmartObject")) {
        sb.append(prop + "=\'" + sqlEscape(props[i].getReadMethod().invoke(so, null)) + "\', ");
        addedProperty = true;
      }
    }
    sb.deleteCharAt(sb.length() - 2);
    sb.append("WHERE id = " + so.getID());
    if (addedProperty) {
      executeUpdate(sb.toString());
      so.setClean(true);
    }
  }
  catch (Exception e) {
    throw new SmartObjectException("Exception storing object: " + so, e);
  }
}