public void abrirRecursivo() throws Exception {

    this.abrirEstado();

    Field[] fillos = this.getClass().getFields();

    ArrayList<Field> aFields = new ArrayList<Field>(Arrays.asList(fillos));

    for (Field field : aFields) {

      if (!field.getName().equals("id") && !field.getName().equals("willBeSaved")) {

        if ("Set".equals(field.getType().getSimpleName())) {

          Object value =
              new PropertyDescriptor(field.getName(), this.getClass()).getReadMethod().invoke(this);
          Class<? extends Set> theClass = Class.forName("java.util.Set").asSubclass(Set.class);
          Set objSet = theClass.cast(value);

          for (Object obj : objSet) {
            if (obj instanceof models.UnionSecureModel) {
              UnionSecureModel u = (UnionSecureModel) obj;
              u.abrirEstado();
              u.abrirRecursivo();
            }
          }

        } else {

          Object obj =
              new PropertyDescriptor(field.getName(), this.getClass()).getReadMethod().invoke(this);

          if (obj instanceof models.UnionSecureModel) {
            UnionSecureModel u = (UnionSecureModel) obj;
            u.abrirEstado();
            u.abrirRecursivo();
          }
        }
      }
    }
  }