# Domain: SecurityArea ## Zweck Abbildung eines Schutzbereichs einer Maschine mit zugehörigen Schutzeinrichtungen, Gefahrenstellen und Schaltgeräten sowie Fragebögen zur Bewertung. ## Haupt-Entitäten (Ausschnitt) - `SecurityArea` - `SecurityDevice` (Liste in Area) - `DangerPoint` - `SwitchingDevice` - `SecurityAreaQuestionnaire` (assoziative Entity zwischen Schutzbereich und `Questionaire`) - `Questionaire` ## Lebenszyklus 1. Erstellung im UI: Neues `SecurityArea` Objekt mit Fake-ID (negativ). 2. Bearbeitung von Eigenschaften (Name, Typen/Enums: `ProtectionType`, `MountingPosition`, `OverrunMeasurementType`, `ApproachSpeed`). 3. Hinzufügen von Schutzeinrichtungen/Gefahrenstellen/Schaltgeräten (ebenfalls ggf. mit Fake-ID bis persistiert). 4. Speichern: Negative IDs der neuen Objekte werden auf `null` gesetzt → Persist durch `SecurityAreaManager.save` / Sammelspeicher. 5. Nach Persist: Re-Load (`refresh`/`reloadWithQuestionnaires`) vor weiterer Bearbeitung. ## Klonen `SecurityAreaManager.cloneArea(SecurityArea area)`: - Lädt persistente Quelle (falls ID > 0) vollständig. - Erzeugt neue Kopie via Copy-Konstruktor. - Controller passt Namen an (`Original (Kopie)`), setzt neue `null` IDs für untergeordnete Objekte. ## Fragebogen-Verknüpfung ### Hinzufügen - Methode: `addQuestionnaireToSecurityArea(area, questionnaire)`. - Erzeugt `SecurityAreaQuestionnaire` Wrapper. - Persist Wrapper, merge Area. - UI aktualisiert Liste und sendet Erfolgsmeldung. ### Entfernen - `removeQuestionnaireFromSecurityArea(area, securityAreaQuestionnaire)` entfernt Element aus Sammlung & ruft `em.remove`. ### Verfügbare Fragebögen - `getAvailableQuestionnaires(area)` holt alle `Questionaire` und filtert bereits zugeordnete anhand Name. Verbesserung: Nutzung ID statt Name zur Eindeutigkeit. ## Konsistenz / Referentielle Integrität Beim Löschen eines Schutzbereichs (`deleteSelected()` im Controller): 1. Entfernen aus Maschine. 2. Auflösen aller Kind-Referenzen (SwitchingDevices, DangerPoints, SecurityDevices) durch Setzen der Area auf `null`. 3. Entfernen der Kindobjekte via entsprechende Manager (`removeAllIn`). 4. Löschen des `SecurityArea` via Named Query (`SecurityArea.DELETE`). ## Potentielle Verbesserungen - Cascade Settings genauer prüfen (evtl. kann Teil der manuellen Löschlogik automatisiert werden). - Validierung (Bean Validation) für Pflichtfelder (Name nicht leer, Enums nicht null soweit fachlich notwendig). - Nutzung DTOs zur Entkopplung UI ↔ JPA (reduziert Lazy Probleme). --- Aktualisiert: 2025-10-20