defect
In der Datenbankdefinition für Tag gibt es eine Referenz "taggedObject". Diese hat als Zieltyp den abstrakten Typ "Object" ist aber monomorph, d.h. in der Datenbank wird nicht gespeichert welcher Typ das getaggete Objekt hat.
Wird versucht in diese Referenz etwas zu speichern (z.B. eine Group), kommt es zu einem Fehler
Caused by: com.top_logic.element.meta.AttributeException: com.top_logic.dob.ex.IncompatibleTypeException: Value must have type 'Object' but has 'Group' at com.top_logic.element.meta.kbbased.storage.AbstractStorage.update(AbstractStorage.java:92) at com.top_logic.element.meta.AttributeUpdate$DefaultStorageAlgorithm.store(AttributeUpdate.java:80) at com.top_logic.element.meta.AttributeUpdate.store(AttributeUpdate.java:654) at com.top_logic.element.meta.form.overlay.FormObjectOverlay.store(FormObjectOverlay.java:322) at com.top_logic.element.meta.AttributeUpdateContainer.store(AttributeUpdateContainer.java:699) 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:1413) ... 67 more Caused by: com.top_logic.dob.ex.IncompatibleTypeException: Value must have type 'Object' but has 'Group' at com.top_logic.knowledge.KnowledgeReferenceStorageImpl.checkType(KnowledgeReferenceStorageImpl.java:186) at com.top_logic.knowledge.KnowledgeReferenceStorageImpl.checkAttributeValue(KnowledgeReferenceStorageImpl.java:95) at com.top_logic.knowledge.service.db2.DBKnowledgeItem.setValue(DBKnowledgeItem.java:268) at com.top_logic.knowledge.service.db2.DynamicKnowledgeItem.setAttributeValue(DynamicKnowledgeItem.java:124) at com.top_logic.element.meta.kbbased.storage.ForeignKeyStorage.storeReferencedTLObject(ForeignKeyStorage.java:167) at com.top_logic.element.meta.kbbased.storage.TLItemStorage.internalSetAttributeValue(TLItemStorage.java:112) at com.top_logic.element.meta.AbstractStorageBase.setAttributeValue(AbstractStorageBase.java:81) at com.top_logic.element.meta.kbbased.storage.AbstractStorage.update(AbstractStorage.java:88) ... 74 more
Randnotiz: Da in dem Modell das Attribut "Tag:Tag#taggedObject" einen "historic-storage" nutzt, fällt das Problem nicht auf.
Migration
- Die Migrationen Ticket_29361_Made_Tag_taggedObj_polymorphic und Ticket_29361_Move_taggedObj_to_Tag_table (Modul tl-element) stellen die Referenz Tag:Tag#taggedObject automatisch um (polymorph, neue Spalte TAGGED_OBJ_TYPE, Ablage als Fremdschlüssel in der Tabelle Tag). Manuell ist nichts zu tun, sofern die Anwendung das Tag-Schema nicht selbst erweitert.
- Schemaprüfung verschärft: Eine monomorphe Referenz, deren Zieltyp eine abstrakte MOClass oder eine MOAlternative ist, wird beim Auflösen des Schemas mit einer DataObjectException ("... must be a non-abstract class") zurückgewiesen, statt erst beim Speichern eines Wertes mit einer IncompatibleTypeException zu scheitern. Eigene *Meta.xml mit einer solchen Referenz müssen sie polymorph deklarieren oder auf einen konkreten Typ zeigen lassen; die Anwendung startet sonst nicht.
- Migrations-API: Util.updateTLReference(...), Util.updateInverseReference(...) und Util.updateTLStructuredTypePart(...) (com.top_logic.model.migration) haben hinter dem HistoryType einen zusätzlichen Parameter DeletionPolicy (null belässt den Wert). Eigene Migrationsprozessoren, die diese Methoden aufrufen, müssen angepasst werden.