code: void buildIntermediateManyToManyManyToMany(Relation middleToLeft, Entity middleEntity, Relation middleToRight) {
          // MANY TO MANY
          // Note: if the manyToManyConfig is null, by convention, we create the m2m relation
  
          Namer toNamer = relationUtil.getManyToManyNamer(middleToLeft.getTo(), middleToRight.getFromAttribute().getColumnConfig(), middleToRight.getTo());
          Namer fromNamer = relationUtil.getManyToManyNamer(middleToRight.getTo(), middleToLeft.getFromAttribute().getColumnConfig(), middleToLeft.getTo());
  
          ManyToMany m2m = new ManyToMany(fromNamer, toNamer, middleEntity, middleToLeft, middleToRight);
          ManyToManyConfig m2mConfig = middleToRight.getFromAttribute().getColumnConfig().getManyToManyConfig();
          m2m.setCascadeGetter(m2mConfig);
          m2m.setFetchTypeGetter(m2mConfig);
          m2m.setOrderByGetter(m2mConfig);
  
          setLabelPlural(m2mConfig, m2m);
          initDisplayOrderAsString(m2mConfig, m2m);
          configureActions(m2m, cfg().getDefaultManyToManyConfig(), m2mConfig);
          middleToLeft.getToEntity().addRelation(m2m);
  
          if (shouldCreateInverse(m2m)) {
              // MANY TO MANY inverse
              ManyToMany inverseM2m = (ManyToMany) m2m.createInverse(); // TODO: fix cast ?
              ManyToManyConfig inverseM2mConfig = middleToLeft.getFromAttribute().getColumnConfig().getManyToManyConfig();
              inverseM2m.setCascadeGetter(inverseM2mConfig);
              inverseM2m.setFetchTypeGetter(inverseM2mConfig);
              inverseM2m.setOrderByGetter(inverseM2mConfig);
              setLabelPlural(inverseM2mConfig, inverseM2m);
              initDisplayOrderAsString(inverseM2mConfig, inverseM2m);
              configureActions(inverseM2m, cfg().getDefaultInverseManyToManyConfig(), inverseM2mConfig);
              middleToRight.getToEntity().addRelation(inverseM2m);
          }
      }
docs: -------------------------------------------------