CodamAIDocs
Themafertig

Modellieren im Hub

Was man im Hub festlegt: System, Ordner, Modell, Feld, Beziehung, Regeln, Endpunkte, Rechte. Und welche Modellierungsregeln gelten.

Ausprägungen
System (Modul)Ordner und EnumerationDatenmodell, abstraktes Modell, Datei-ModellPrimitivfeld, Enum-Feld, BeziehungsfeldRegeln am FeldEndpunkteRechteZugriffsfilter und Hooks

Worum es geht

Bevor es Code gibt, gibt es ein Modell. Du beschreibst im Hub, welche Dinge deine Anwendung kennt (Kunde, Auftrag, Rechnung), welche Felder sie haben, wie sie zusammenhängen und wer was darf. Aus dieser Beschreibung erzeugt der Build später den ganzen Code, siehe Codegenerierung im Build.

Du modellierst also, du programmierst hier nicht. Alles, was du festlegst, sind Daten im Hub: die Metadaten deiner Anwendung.

Das Meta-Modell

So hängen die Dinge zusammen, die du im Hub anlegst:

flowchart TD
    P["Projekt"] --> S["System<br/>(eine CDMS-Anwendung)"]
    S --> F["Ordner"]
    S --> E["Enumeration"]
    S --> M["Modell"]
    F -. "enthält" .-> M
    F -. "enthält" .-> E
    E --> EI["Enum-Wert"]
    M --> FD["Feld"]
    M --> EP["Endpunkt"]
    M --> R["Rolle"]
    M --> AF["Zugriffsfilter"]
    M --> H["Hook"]
    M -. "erbt von" .-> AM["abstraktes Modell"]
    FD --> RU["Regel"]
    FD --> FR["Feldrolle"]
    FD -. "Enum-Feld" .-> E
    FD -. "Beziehungsfeld" .-> M
Bausteinwas es istwichtige Angaben
Systemeine CDMS-Anwendung. In der Hub-Übersicht heißt es Modul, in der Modellierungsoberfläche ServiceName, Version, Datenbank, Anmeldung, Speicher, Monitoring, CIAS. Diese Einstellungen steuern den Projektrahmen
Ordnergruppiert Modelle und EnumerationenName. Der Pfad (/crm/vertrieb) ergibt später den API-Pfad und das Java-Paket
Enumerationeine feste Werteliste, z. B. CUSTOMER_STATUSEnum-Werte in GROSSSCHREIBUNG
Modellein Ding deiner Fachlichkeit, z. B. CustomerArt, Ebene, Singleton, Auditing, Basismodell
Feldeine Eigenschaft des ModellsArt, Typ, Länge, Defaultwert, Regeln, Feldrollen
Endpunkteine Operation, die es geben sollTyp: CREATE, READ, UPDATE, DELETE, LIST, HISTORY_*, UPLOAD, DOWNLOAD
Rollemarkiert eine Operation als rollenpflichtigCREATE, READ, UPDATE, DELETE
Zugriffsfilterzeigt nur Zeilen, die zu einem Benutzerattribut passenProfilattribut → Feld
Hookkündigt eigene Logik an–

Drei Arten von Modellen

Welche Art von Modell?
Datenmodell
der Normalfall
  • hat eine Tabelle und Endpunkte
  • kann von einem abstrakten Modell erben
  • kann Singleton sein: genau ein Objekt
Abstraktes Modell
gemeinsame Basis
  • kann nicht selbst angelegt werden
  • vererbt seine Felder an Datenmodelle
  • eine Suche darauf findet alle Untertypen
Datei-Modell
Datensatz mit Datei
  • bringt Dateifelder schon mit (Name, MIME-Typ, Größe)
  • Endpunkte UPLOAD und DOWNLOAD
  • braucht am System einen Speicher

Ein Modell kann nur von einem abstrakten Modell erben. Mehr dazu unter Abstrakte Modelle, Singleton und Das Datei-Modell.

Zu jedem Modell legst du außerdem fest:

AngabeWertebewirkt
Ebene (modelType)TENANT (Standard), SYSTEM, USERwo die Daten liegen und wer sie sieht, siehe Modell-Ebenen
Singletonja / neingenau ein Objekt pro Mandant, eigene Endpunkte ohne id
Auditingja / neinjede Änderung wird als Revision gespeichert, Historie und Rollback werden möglich

Felder

Jedes Feld ist eine von drei Arten:

Drei Arten von Feldern

Wann: ein einfacher Wert

Du wählst einen Typ: STRING, INTEGER, FLOAT, DOUBLE, BOOLEAN, DATE, TIME oder DATE_TIME. Bei STRING gibst du eine Länge an. Optional setzt du einen Defaultwert, der zum Typ passen muss (true/false, ganze Zahl, Zahl).

Wann: ein Wert aus einer festen Liste

Das Feld zeigt auf eine Enumeration. Optional wählst du einen Enum-Wert als Defaultwert.

Wann: ein Verweis auf ein anderes Modell

Du wählst die Beziehungsart (ONE_TO_ONE, ONE_TO_MANY, MANY_TO_ONE, MANY_TO_MANY) und das Zielmodell. Die Gegenseite legt der Hub automatisch am Zielmodell an. Unter Rekursion legst du fest, ob über die Beziehung mit angelegt (CREATE), mit geändert (UPDATE) oder mit gelöscht (DELETE) werden darf.

Ergebnis: Siehe Beziehungstypen und Die vier Fälle beim verschachtelten Schreiben

Eine Beziehung ist im Hub immer ein Feldpaar. Legst du an Order das Feld customer (MANY_TO_ONE auf Customer) an, entsteht an Customer das Gegenfeld mit der umgekehrten Art (ONE_TO_MANY). Beide werden in einer Transaktion gespeichert. Löschst du eine Seite, löscht der Hub die andere mit.

du legst anGegenseite wird
ONE_TO_ONEONE_TO_ONE
MANY_TO_ONEONE_TO_MANY
ONE_TO_MANYMANY_TO_ONE
MANY_TO_MANYMANY_TO_MANY

Manche Felder legst du nie selbst an, weil jedes Modell sie schon hat: id, _createdOn, _updatedOn und je nach Ebene _userId. Siehe Systemfelder.

Regeln am Feld

Regeln sagen, welche Werte ein Feld annehmen darf. CDMS prüft sie beim Schreiben, siehe Validierung.

Regel in der OberflächeRegel-IDgilt für
Pflichtfeld@nullablealle Felder
Pflicht nur beim Anlegen / Ändern@notNullOnCreate, @notNullOnUpdatealle Felder
nicht leer@notEmptySTRING, Listen-Beziehungen
nicht mehr änderbar@noUpdatePrimitiv- und Enum-Felder
eindeutig@uniquePrimitiv- und Enum-Felder
Muster (regulärer Ausdruck)@patternSTRING
Langtext@lobSTRING
verschlüsselt, siehe Verschlüsselte Felder@encryptedSTRING, nicht zusammen mit „eindeutig“
Mindest- / Höchstwert@min, @maxINTEGER, FLOAT, DOUBLE
Feld-Hook@hook mit dem Klassennamen, siehe Feld-HooksPrimitiv- und Enum-Felder

Die Höchstlänge eines Textes ist keine Regel, sondern die Eigenschaft Länge des Feldes.

Einige Regeln kannst du auf einen Geltungsbereich beschränken: ALWAYS (Standard), nur CREATE oder nur UPDATE. Das geht bei „nicht leer“, „Muster“ und „Mindest-/Höchstwert“. Beim Pflichtfeld steckt die Operation schon in der Regel selbst.

Endpunkte und Rechte

Im Reiter Endpunkte legst du fest, welche Operationen es für das Modell gibt. Die Oberfläche bietet immer die fünf Grundoperationen an (CREATE, READ, UPDATE, DELETE, LIST). Die Historie-Endpunkte gibt es nur bei auditierten Modellen, UPLOAD und DOWNLOAD nur bei Datei-Modellen. Was welcher Typ im Code erzeugt, steht unter Welche Endpunkte ein Modell hat.

Im Reiter Berechtigungen markierst du, welche Operationen eine eigene Rolle verlangen. Du setzt dabei nur einen Haken je Operation. Den Rollennamen bildet der Generator nach einem festen Schema aus Ordner, Modell und Operation. Genauso gibt es Feldrollen am einzelnen Feld. Siehe Modellrollen, Feldrollen und Rollennamen.

Im Reiter Filter verbindest du ein Profilattribut des Benutzers mit einem Feld. Dann sieht jeder nur die Zeilen, deren Feld zu seinem Attribut passt, siehe Attributfilter.

Welche Regeln der Hub durchsetzt

Beim Speichern prüft der Hub deine Eingaben. Ein Verstoß wird abgelehnt, und die Oberfläche zeigt dir den Grund am Feld.

RegelBeispiel für einen VerstoßAntwort
Namen von System, Ordner, Modell, Enumeration: Buchstabe zuerst, dann Buchstaben, Ziffern, _, mindestens 2 Zeichen1Kunde422 mit Liste der Verstöße
Feldname: Buchstabe zuerst, höchstens 51 Zeichen, kein Java-Schlüsselwortclass, new400 invalid-field-name
Feldname im Modell eindeutig (Groß-/Kleinschreibung zählt nicht)name und Name409 duplicated-field
Enum-Wert in Großbuchstaben, eindeutig in der Enumerationaktiv400 invalid-enum-value / 409 duplicated-enum-value
Name eindeutig im Ordnerzwei Modelle Customer in /crm409
Länge nur bei STRING, Defaultwert passt zum TypLänge bei INTEGER400
Datei-Modell: name, size, mimeType sind schon vergebeneigenes Feld name400
ein Modell erbt nicht von sich selbstCustomer erbt von Customer400

Den Pfad eines Ordners berechnet der Hub selbst. Benennst du einen Ordner um oder verschiebst ihn, passt er die Pfade des ganzen Teilbaums an.

Manche Dinge sind erlaubt, aber meistens ein Versehen. Dafür zeigt die Oberfläche am Feld ein Warnzeichen:

Warnungworum es geht
Audit-Lückeein auditiertes Modell zeigt auf ein nicht auditiertes. Dessen Änderungen tauchen in der Historie nicht auf
Ebenen-Konfliktein SYSTEM-Modell ist mit einem TENANT- oder USER-Modell verbunden. Die Daten liegen in verschiedenen Datenbanken
Liste auf Singletoneine Listen-Beziehung zeigt auf ein Singleton, von dem es nur ein Objekt gibt

Checkliste: ein neues Modell

  1. 1
    Entwickler→Hub
    öffnet im Projekt das System und prüft seine Einstellungen: Datenbank, Anmeldung, Speicher, Monitoring
    Für ein Datei-Modell muss der Speicher auf FILESYSTEM stehen.
  2. 2
    Entwickler→Hub
    legt bei Bedarf zuerst Ordner und Enumerationen an
  3. 3
    Entwickler→Hub
    legt das Modell an: Art (Datenmodell, abstrakt, Datei), Name, Beschreibung, Ordner
  4. 4
    Entwickler→Hub
    setzt die Modelleigenschaften: Ebene, Basismodell, Singleton, Auditing
    Mit Auditing legt die Oberfläche die Historie-Endpunkte gleich mit an.
  5. 5
    Entwickler→Hub
    legt die Felder an, mit Typ, Länge, Defaultwert, Regeln und Feldrollen. Bei Beziehungen Art, Ziel und Rekursion
    Nicht anlegen: id, Zeitstempel, geerbte Felder.
  6. 6
    Entwickler→Hub
    prüft die Endpunkte. Bei einem Datei-Modell UPLOAD und DOWNLOAD einschalten
  7. 7
    Entwickler→Hub
    markiert, welche Operationen eine Rolle verlangen, und legt bei Bedarf Zugriffsfilter an
  8. 8
    Hub
    Warnzeichen an den Feldern?
  9. 9
    Build→Hub
    holt beim nächsten Build die Metadaten und erzeugt den Code
    Ergebnis: Das Modell ist in der Anwendung angekommen

Statt von Hand kann auch ein KI-Client das Modell ändern, über den MCP-Server des Hubs.

Fallen

Quellen im Code und in der Wissensdatenbank
  • hub-backend – structure/models.yaml, structure/enumerations.yaml (das Meta-Modell)
  • hub-backend – services/CdmsNaming, AbstractFieldHook, EnumItemHook, FolderHook, ModelFieldHook, ModelDesignApi, ModelDesignService
  • hub-backend – mcp/capabilities/CdmsCapabilitiesService (Systemfelder, Datei-Modell)
  • CDMS/frontend – components/cdms/ItemCreateDialog.vue, ModelFormFields.vue, FieldDialog.vue, ModelView.vue
  • CDMS/frontend – shared/utils/cdmsFieldRules.ts, cdmsEndpoints.ts, cdmsAccessFilters.ts, server/utils/cdmsFields.ts, cdmsItemName.ts
  • CDMS/cdms-generator – loader/CdmsYamlLoader (applyRuleList)
  • documentation/90-hub/01-modellierung.md, 10-cdms-grundlagen/02-modelle-und-metadaten.md
Suchen