code: public Set<String> getAttributeNamesSkipId() {
          if (attributeNamesNoId == null) {//no one cares about unfortunate multi-threading timing with 2 instances created
              //if someone does, use DCL with volatile
              Set<String> attributesNames = new CaseInsensitiveSet(getAttributeNames());
              attributesNames.remove(getIdName());
              attributeNamesNoId = attributesNames;
          }
          return attributeNamesNoId;
      }
docs: Finds all attribute names except for id.
  
  @return all attribute names except for id.