code: @SuppressWarnings("unchecked")
    public static <E extends SpecificRecord, S extends SpecificRecord> Dao<E> buildCompositeDao(
        HTablePool tablePool, String tableName,
        List<String> subEntitySchemaStrings, Class<E> entityClass) {
  
      List<EntityMapper<S>> entityMappers = new ArrayList<EntityMapper<S>>();
      for (String subEntitySchemaString : subEntitySchemaStrings) {
        AvroEntitySchema subEntitySchema = parser
            .parseEntitySchema(subEntitySchemaString);
        Class<S> subEntityClass;
        try {
          subEntityClass = (Class<S>) Class.forName(subEntitySchema
              .getAvroSchema().getFullName());
        } catch (ClassNotFoundException e) {
          throw new RuntimeException(e);
        }
        entityMappers.add(SpecificAvroDao.<S> buildEntityMapper(
            subEntitySchemaString, subEntitySchemaString, subEntityClass));
      }
  
      return new SpecificCompositeAvroDao<E, S>(tablePool, tableName,
          entityMappers, entityClass);
    }
docs: Create a CompositeDao, which will return SpecificRecord instances
  represented by the entitySchemaString avro schema. This avro schema must be
  a composition of the schemas in the subEntitySchemaStrings list.
  
  @param tablePool
  An HTablePool instance to use for connecting to HBase
  @param tableName
  The table name this dao will read from and write to
  @param keySchemaString
  The Avro schema string that represents the StorageKey structure for row
  keys in this table.
  @param subEntitySchemaStrings
  The list of entities that make up the composite. This list must be
  in the same order as the fields defined in the entitySchemaString.
  @param keyClass
  The class of the SpecificRecord representing the StorageKey of rows this
  dao will fetch.
  @param entityClass
  The class of the SpecificRecord this DAO will persist and fetch.
  @return The CompositeDao instance.
  @throws SchemaNotFoundException
  @throws ValidationException