# Cloning Instructions Aktualisiert: 2025-10-20 ## Ziel Sicheres Klonen von komplexen Domains (z.B. SecurityArea inkl. Sub-Entities) ohne ID-Kollisionen oder versehentliches Persistieren historischer Referenzen. ## Grundprinzipien - Nur persistente Quelle klonen (ID > 0) -> Vorher `refresh` zur Initialisierung Lazy Collections. - Neue Instanzen erhalten `id = null` (oder negative Fake-ID falls im UI direkt angezeigt). - Child-Entitäten ebenfalls mit `id = null` erzeugen. ## Vorgehen (Muster) 1. Quelle laden (Manager.find) & `refresh`. 2. Copy-Konstruktor oder Factory-Methode: Primitive Felder kopieren, Collections iterieren. 3. Collections: Neue Collection erzeugen, für jedes Kind tiefes Copy erstellen (kein Reuse Managed Instanz!). 4. IDs aller Kinder null setzen. 5. Optionale Anpassungen (Name -> "Kopie von "). 6. Rückgabe unverpersistiertes Root-Objekt an Controller. ## Tiefe vs. Flache Kopie - Tiefe Kopie: Notwendig wenn Kinder eigenständige persistente Entities sind. - Flache Kopie: Ausreichend falls nur Referenzen (Read-Only) erhalten bleiben sollen; aktuell bevorzugt tiefe Kopie für isolierte Bearbeitung. ## Edge Cases - Quelle == null -> abort. - Quelle mit Lazy Collections nicht initialisiert -> Gefahr LazyInitializationException. - Zyklische Referenzen -> sorgfältig verhindern Endlosschleifen (ggf. bereits geklonte Instanzen in Map tracken). ## Fake IDs - Wenn Klon direkt in UI Collection erscheint: negative ID via `createFakeID` generieren. - Vor persist -> ID auf null setzen. ## Verbesserungen - Einführung eines generischen `CloneService` mit rekursiver Strategie und Zyklus-Erkennung. - Annotation @SkipClone für Felder die nicht übernommen werden sollen. ## Generator Leitplanken - Keine Reflection-Magie für tiefe Kopien; lieber explizite Copy-Konstruktoren für Lesbarkeit. - Reihenfolge: zuerst Root, dann Kinder. ---