Feldrelationen

Über die von uns zur Verfügung gestellten Feldrelationen können Sie Beziehungen unter Ihren Services abbilden. Wenn Sie eine Anzahl an Produkten persistieren möchten und jedes Produkt ist dabei einer Kategorie zugeordnet, dann macht es Sinn, das Datenmodell für Kategorien vom Datenmodell für Produkte zu separieren. Sie hätten dann sowohl einen Service für Produkte, als auch für Kategorien. Die Verknüpfung der Services untereinander können Sie mit Feldrelationen realisieren.

Relationstypen

Es existieren vier unterschiedliche Relationstypen:

Typ Definition Beispiel
OneToOne Ein Datensatz aus Ihrem Service ist genau einem Datensatz aus einem anderen Service zugeordnet.
  • Kontaktdaten einer Person
  • Produktdetails eines Produkts
OneToMany / ManyToOne Ein Datensatz aus Ihrem Service ist mehreren Datensätzen aus einem anderen Service zugeordnet.
  • Bestellvorgänge eines Kunden
  • Produkte in einer Kategorie
ManyToMany Mehrere Datensätze aus Ihrem Service sind mehreren Datensätzen aus einem anderen Service zugeordnet.
  • Produkte in mehreren Kategorien

Hinweis

Die Generierung Ihrer API bricht momentan vorzeitig ab, wenn Sie an einer Stelle eine OneToMany-Relation definieren. Wir rüsten die Funktionalität später nach. Wenn Sie eine OneToMany-Beziehung implementieren möchten, dann gehen Sie vorläufig bitte den umgekehrten Weg und implementieren am inversen Service eine ManyToOne-Relation. Die Funktionalität Ihrer API ist später dieselbe.

Feldrelationen anlegen

Wenn Sie ein Feld vom Datentyp relation angelegt haben, dann können Sie diesem Feld eine entsprechende Beziehung zuordnen. Sie spezifizieren dabei lediglich den Relationstyp und den Servive, zu dem Sie die Beziehung herstellen möchten.

Sie könnten beispielsweise dem Service Article ein author-Feld zuordnen, in welchem der Autor des entsprechenden Artikels persistiert wird. Das author-Feld wäre dann eine Relation zu Ihrem Author-Service, in dem Sie eine Reihe an Autoren vorrätig halten:

curl -X POST "https://localhost/aaas/service/fields" ...
{
  "name": "author",
  "dataType": "relation",
  "service": "/aaas/repository/services/1"
}

Im obigen Beispiel legen Sie ein Feld vom Typ relation an und ordnen es dem entsprechenden Service zu. Anschließend legen Sie die Details zugehörigen Relation fest:

curl -X POST "https://localhost/aaas/field/relations" ...
{
  "type": "ManyToOne",
  "field": "/aaas/service/fields/1",
  "service": "/aaas/repository/services/2"
}

Der Server antwortet mit der angelegten Ressource:

{
    "id": 1,
    "type": "ManyToOne",
    "mappedBy": null,
    "inversedBy": null,
    "orphanRemoval": false,
    "joinColumnName": null,
    "joinColumnReferencedColumnName": "id",
    "joinColumnIsUnique": false,
    "joinColumnIsNullable": true,
    "field": "/aaas/service/fields/1",
    "service": "/aaas/repository/services/2"
}

Wenn Sie später Ihre API generieren lassen, dann erhält auf Datenbankebene die Api_Article-Tabelle den Fremdschlüssel author_id.

Sie können natürlich auch Felder und gleichzeitig Relationen anlegen. Benutzen Sie dafür die Serialisierungsgruppe relation:

curl -X POST  "https://localhost/aaas/service/fields?groups[]=relation" ...
{
  "name": "author",
  "dataType": "relation",
  "service": "/aaas/repository/services/1",
  "relation": {
    "service": "/aaas/repository/services/2",
    "type": "ManyToOne"
  }
}
{
    "id": 1,
    "name": "author",
    "description": null,
    "dataType": "relation",
    "length": null,
    "dataTypePrecision": null,
    "dataTypeScale": null,
    "isUnique": false,
    "isNullable": false,
    "service": "/aaas/repository/services/1",
    "fieldOptions": [
    ],
    "constraints": [
    ],
    "relation": {
        "id": 1,
        "type": "ManyToOne",
        "mappedBy": null,
        "inversedBy": null,
        "orphanRemoval": false,
        "joinColumnName": null,
        "joinColumnReferencedColumnName": "id",
        "joinColumnIsUnique": false,
        "joinColumnIsNullable": true,
        "field": "/aaas/service/fields/1",
        "service": "/aaas/repository/services/2"
    }
}

Wenn Sie keinen Relationstypen angeben, dann wird standardmäßig eine Relation vom Typ ManyToOne erzeugt.

Feldrelationen bearbeiten

Obschon die Bearbeitung von Feldrelationen wahrscheinlich selten vorkommt, geben wir Ihnen an der Stelle trotzdem einen entsprechenden Überblick. Sie senden dafür einen HTTP-Put-Request an den korrespondierenden Endpunkt:

curl -X PUT  "https://localhost/aaas/field/relations/1" ...
{
  "type": "ManyToMany"
}

Sie ändern im obigen Beispiel den Relationstyp auf ManyToMany.

Feldrelationen löschen

Beim Löschen von Feldrelationen senden Sie einen HTTP-Delete-Request an den entsprechenden Endpunkt:

curl -X DELETE  "https://localhost/aaas/field/relations/1" ...

Der API-Server antwortet mit dem HTTP-Statuscode 204 (No Content).

Feldrelationen anzeigen

Um sich alle Relationen anzeigen zu lassen, die einem bestimmten Service zugeordnet sind, senden Sie einen HTTP-Get-Request an den entsprechenden Endpunkt und setzen den HTTP-Query-Parameter service auf den zugehörigen Wert:

curl -X GET  "https://localhost/aaas/field/relations?service=2" ...
[
    {
        "id": 1,
        "type": "ManyToOne",
        "mappedBy": null,
        "inversedBy": null,
        "orphanRemoval": false,
        "joinColumnName": null,
        "joinColumnReferencedColumnName": "id",
        "joinColumnIsUnique": false,
        "joinColumnIsNullable": true,
        "field": "/aaas/service/fields/1",
        "service": "/aaas/repository/services/2"
    }
]

Serialisierungsgruppen

Es folgt eine Übersicht der verwendeten Serialisierungsgruppen bei Feldrelationen:

Gruppe Definition
field Serialisiert/Deserialisiert field-Attribute

Serialisierung von Feldern

Wenn Sie zusätzlich zu den Relationen noch die entsprechenden Felder serialisieren lassen möchten, dann senden Sie als HTTP-Query-Parameter die entsprechende Serialisierungsgruppe und setzen den Wert auf field:

curl -X GET  "https://localhost/aaas/field/relations/1?groups[]=field" ...
{
    "id": 1,
    "type": "ManyToOne",
    "mappedBy": null,
    "inversedBy": null,
    "orphanRemoval": false,
    "joinColumnName": null,
    "joinColumnReferencedColumnName": "id",
    "joinColumnIsUnique": false,
    "joinColumnIsNullable": true,
    "field": {
        "id": 1,
        "name": "author",
        "description": null,
        "dataType": "relation",
        "length": null,
        "dataTypePrecision": null,
        "dataTypeScale": null,
        "isUnique": false,
        "isNullable": false,
        "service": "/aaas/repository/services/1",
        "fieldOptions": [
        ],
        "constraints": [
        ],
        "relation": "/aaas/field/relations/1"
    },
    "service": "/aaas/repository/services/2"
}