public static BTContainerImpl getOrCreateImpl(BTContainerDto dto) {
   BTContainerImpl containerImpl = (BTContainerImpl) ImplCache.get(dto);
   if (containerImpl == null) {
     containerImpl = createImpl(dto);
     ImplCache.put(dto, containerImpl);
   }
   return containerImpl;
 }
  private static void updateWaypointRelations(BTContainerImpl impl, BTContainerDto dto) {
    // Kopieren der Container-Liste
    // TODO can this be null?
    Set waypointDtos = new HashSet(dto.getWaypoints());

    // Schritt 1: updaten der vorhandenen sites
    for (Iterator iter = impl.getWaypoints().iterator(); iter.hasNext(); ) {
      BTWaypointImpl waypointImpl = (BTWaypointImpl) iter.next();
      boolean exists = false;
      for (Iterator iterator = waypointDtos.iterator(); iterator.hasNext(); ) {
        BTWaypointDto waypointDto = (BTWaypointDto) iterator.next();
        if (waypointImpl.getId().equals(waypointDto.getId())) {
          ImplCache.put(waypointDto, waypointImpl);
          BTWaypointProxy.updateImpl(waypointImpl, waypointDto);
          // dto entfernen, um nur neue übrig zu behalten
          iterator.remove();
          exists = true;
          break;
        }
      }

      // Schritt 2: site nicht mehr vorhanden -> löschen
      if (!exists) {
        iter.remove();
      }
    }
    // Schritt 3: neue sites anlegen
    for (Iterator iterator = waypointDtos.iterator(); iterator.hasNext(); ) {
      BTWaypointDto waypointDto = (BTWaypointDto) iterator.next();
      // Könnte theoretisch schon angelegt sein (über eine noch zu deginierende Beziehung) ;-)
      BTWaypointImpl newImpl = BTWaypointProxy.getOrCreateImpl(waypointDto);
      impl.addBTWaypointToWaypoints(newImpl);
    }
  }