Detail
#28071
Löschen von Inline Kompositionselementen im Formular scheitert, wenn gelöschtes Objekt weitere Löschungen auslöst
Hintergrund
Folgendes Modell:
"A"s haben "B"s und "B"s haben "C"s. Jeweils als Komposition, mehrere Werte, geordnet. Alle Klassen haben ein Attribut "name" vom Typ String.
Ein Formular zeigt eine Instanz von A mit den Feldern "name" und "B"s. "B"s werden als Tabelle dargestellt, die nur die Spalte "name" hat:
Der Formkontext des Formulars wird dabei rekursiv über die Kompositionshierarchie aufgebaut, enthält also neben den Feldern von A auch die der verknüpften "B"s und der enthaltenen "C"s.
Problem
Wird aus der Tabelle eine Zeile (eine Instanz von B) gelöscht, scheitert das Speichern der Änderung, weil im Formkontext auch die Felder aller verknüpften Instanzen von C enthalten sind und auf Modifizierbarkeit geprüft werden, obwohl diese Instanzen als Teile von B gelöscht wurden und daher prinzipiell nicht modifiziert werden können:
Caused by: com.top_logic.knowledge.wrap.exceptions.WrapperRuntimeException: Target object is deleted: DeletedObject(DBKnowledgeObject[wrapper: AttributedWrapper(type:Test:C, id: GenericObject:623170, name: A1.B1.C3)]) at com.top_logic.element.meta.AttributeOperations.checkAlive(AttributeOperations.java:346) at com.top_logic.element.meta.AttributeOperations.checkUpdate(AttributeOperations.java:240) at com.top_logic.element.meta.AttributeUpdate$1.checkUpdate(AttributeUpdate.java:109) at com.top_logic.element.meta.AttributeUpdate.checkUpdate(AttributeUpdate.java:681) at com.top_logic.element.meta.form.overlay.FormObjectOverlay.store(FormObjectOverlay.java:303) at com.top_logic.element.meta.AttributeUpdateContainer.store(AttributeUpdateContainer.java:659) at com.top_logic.element.meta.form.AttributeFormContext.store(AttributeFormContext.java:143) at com.top_logic.element.meta.form.component.AbstractApplyAttributedCommandHandler.saveMetaAttributes(AbstractApplyAttributedCommandHandler.java:48) at com.top_logic.element.meta.form.component.DefaultApplyAttributedCommandHandler.storeChanges(DefaultApplyAttributedCommandHandler.java:29) at com.top_logic.layout.form.component.AbstractApplyCommandHandler.applyChanges(AbstractApplyCommandHandler.java:196)
Anmerkung: Um das Problem zu reproduzieren benötigt man noch weitere Referenzen mit einer gesetzten Löschstrategie, die dazu führen, dass noch andere Objekte gelöscht werden, wenn Teile aus Kompositionen gelöscht werden. Siehe Testfall.
Das Problem ist auch im Instanzenreiter reproduzierbar:
Caused by: com.top_logic.knowledge.wrap.exceptions.WrapperRuntimeException: Target object is deleted: DeletedObject(DBKnowledgeObject[wrapper: AttributedWrapper(type:Test:C, id: GenericObject:623170, name: A1.B1.C3)]) at com.top_logic.element.meta.AttributeOperations.checkAlive(AttributeOperations.java:346) at com.top_logic.element.meta.AttributeOperations.checkUpdate(AttributeOperations.java:240) at com.top_logic.element.meta.AttributeUpdate$1.checkUpdate(AttributeUpdate.java:109) at com.top_logic.element.meta.AttributeUpdate.checkUpdate(AttributeUpdate.java:681) at com.top_logic.element.meta.form.overlay.FormObjectOverlay.store(FormObjectOverlay.java:303) at com.top_logic.element.meta.AttributeUpdateContainer.store(AttributeUpdateContainer.java:659) at com.top_logic.element.meta.form.AttributeFormContext.store(AttributeFormContext.java:143) at com.top_logic.element.layout.grid.DefaultGridApplyHandler.storeChanges(DefaultGridApplyHandler.java:30) at com.top_logic.element.layout.grid.GridComponent.storeRowValues(GridComponent.java:1363)
Test
- /com.top_logic.demo/src/test/java/test/com/top_logic/demo/scripted/model/attribute/composition/TestDeleteNestedCompositions.script.xml