Eine Entity ist ein Objekt, das als Instanz einer Dataclass angesehen werden kann (vergleichbar mit einem Datensatz der Tabelle), die mit der Dataclass in ihrem zugehörigen Datastore übereinstimmt. Eine Entity enthält jedoch auch Daten, die mit der Datenbank des dazugehörigen Datastore zusammenhängen. Die Entity dient zum Verwalten der Daten (Anlegen, Aktualisieren, Löschen). Wird eine Entity-Referenz über eine Entity-Selection erhalten, bewahrt sie Informationen über die Entity-Selection, die ein Blättern durch die Selektion ermöglicht.
Es gibt zwei Möglichkeiten, eine neue Entity in einer Dataclass anzulegen:
Da Entities Referenzen auf Datensätze der Datenbank sind, können Sie Entities erstellen, indem Sie Datensätze mit der klassischen 4D Sprache anlegen und dann mit ORDA Methoden wie entity.next() oder entitySelection.first() darauf verweisen.
Sie können eine Entity auch mit der Methode dataClass.new() erstellen.
Beachten Sie, dass die Entity nur im Speicher angelegt wird. Wenn Sie diese im Datastore hinzufügen wollen, müssen Sie die Methode entity.save( ) aufrufen.
Entity-Attribute stehen direkt als Eigenschaften des Objekts Entity zur Verfügung. Weitere Informationen dazu finden Sie unter Entity Attribute verwenden.
Beispielsweise wollen wir eine neue Entity in der Dataclass "Employee" im aktuellen Datastore anlegen, wobei "John" und "Dupont" den Attributen firstname und name zugeordnet sind:
C_OBJECT($myEntity) $myEntity:=ds.Employee.new() //Ein neues Objekt vom Typ Entity erstellen $myEntity.name:="Dupont" // 'Dupont' dem Attribut 'name' zuordnen $myEntity.firstname:="John" //'John' dem Attribut 'firstname' zuordnen $myEntity.save() //Die Entity sichern
Hinweis: Eine Entity ist nur in dem Prozess definiert, wo sie erstellt wurde. So können Sie beispielsweise nicht eine Referenz auf eine Entity in einer Interprozessvariablen speichern und in einem anderen Prozess verwenden.
Eine Entity enthält eine Referenz auf einen 4D Datensatz. Verschiedene Entities können auf denselben 4D Datensatz verweisen. Da eine Entity in einer 4D Objektvariablen gespeichert werden kann, können verschiedene Variablen eine Referenz auf dieselbe Entity enthalten.
Wenn Sie den folgenden Code ausführen:
C_OBJECT($e1;$e2) $e1:=ds.Employee.get(1) //Zugriff auf den employee mit ID 1 $e2:=$e1 $e1.name:="Hammer" //beide Variablen $e1 and $e2 nutzen die Referenz auf dieselbe Entity //$e2.name enthält "Hammer"
Dies wird durch die folgende Grafik veranschaulicht:
Führen Sie jetzt aus:
C_OBJECT($e1;$e2) $e1:=ds.Employee.get(1) $e2:=ds.Employee.get(1) $e1.name:="Hammer" //Variable $e1 enthält eine Referenz auf eine Entity //Variable $e2 enthält eine andere Referenz auf eine andere Entity //$e2.name enthält "smith"
Dies wird durch die folgende Grafik veranschaulicht:
Beachten Sie jedoch, dass sich Entities auf denselben Datensatz beziehen. In jedem Fall, wenn Sie die Methode entity.save( ) aufrufen, wird der Datensatz aktualisiert (außer im Konfliktfall, siehe Entity sperren).
Tatsächlich ist $e1 und $e2 nicht die Entity selbst, sondern eine Referenz auf die Entity. Das heißt, Sie können sie direkt an eine beliebige Funktion oder Methode übergeben und sie wirkt wie ein Zeiger, ist aber schneller als ein 4D Zeiger. Zum Beispiel:
For each($entity;$selection) do_Capitalize($entity) End for each
Und die Funktion ist:
$entity:=$1 $name:=$entity.lastname If(Not($name=Null)) $name:=Uppercase(Substring($name;1;1))+Lowercase(Substring($name;2)) End if $entity.lastname:=$name
Sie können eine Entity wie alle anderen Objekte in 4D behandeln und ihre Referenzen direkt als Parameter übergeben.
Hinweis: Mit den Entities gibt es kein Konzept "aktueller Datensatz" wie in der klassischen 4D Sprache. Sie können beliebig viele Entities gleichzeitig verwenden. Es gibt auch keine automatische Sperre auf eine Entity (siehe Entity sperren). Wenn eine Entity geladen wird, verwendet sie den 'Lazy loading' Mechanismus, was bedeutet, dass nur die benötigten Informationen geladen werden. Im Client/Server Betrieb kann die Entity jedoch bei Bedarf automatisch direkt geladen werden.
Entity-Attribute speichern Daten und bilden entsprechende Felder in der entsprechenden Tabelle ab. Attribute vom Typ Speicher können als einfache Eigenschaften des Entity-Objekts gesetzt oder abgerufen werden, während Entity vom Typ relatedEntity bzw. relatedEntities eine Entity oder eine Entity-Selection zurückgibt.
Hier ein Beispiel zum Setzen eines Speicher-Attributs:
$entity:=ds.Employee.get(1) //erhält ein employee Attribut mit ID 1 $name:=entity.lastname //erhält den employee Namen, z.B. "Smith"
entity.lastname:="Jones" //setzt den employee Namen
Hinweis: Bild-Attribute lassen sich nicht direkt einem gegebenen Pfad in einer Entity zuordnen.
Der Zugriff auf ein verknüpftes Attribut richtet sich nach der Art des Attributs. Nehmen wir z.B. folgende Struktur:
Sie können auf Daten über das/die verknüpften Objekte zugreifen:
$entity:=ds.Project.all().first().theClient //Die dem Projekt zugewiesene Entity Company erhalten $EntitySel:=ds.Company.all().first().companyProjects //Die Auswahl der Projekte für die Company erhalten
Beachten Sie, dass theClient und companyProjects im obigen Beispiel primäre Verknüpfungsattribute sind und eine direkte Verknüpfung zwischen zwei Dataclasses darstellen. Dagegen lassen sich Verknüpfungsattribute auch auf Pfaden zu Verknüpfungen auf mehreren Ebenen anlegen, inkl. zirkularer Verknüpfungen. Nehmen wir z.B. folgende Struktur:
Jeder employee kann ein Manager sein und einen Manager haben. Um den Manager des Managers eines employee zu erhalten, schreiben Sie einfach:
In der ORDA Architektur können Verknüpfungsattribute direkt Daten enthalten, die mit Entities verknüpft sind:
Ein Verknüpfungsattribut vom Typ N->1 (Typ relatedEntity) enthält eine Entity
Ein Verknüpfungsattribut vom Typ 1->N (Typ relatedEntities) enthält eine Entity-Selection
Sehen wir uns folgende vereinfachte Struktur an:
In diesem Beispiel enthält eine Entity in der Dataclass "Employee" ein Objekt vom Typ Entity im Attribut "employer" (oder einen Wert Null). Eine Entity in der Dataclass "Company" enthält ein Objekt vom Typ Entity-Selection im Attribut "staff" (oder einen Wert Null).
Hinweis: Die Eigenschaft "Manuell" oder "Automatisch" von Verknüpfungen hat keine Auswirkung in ORDA.
Um einen Wert direkt dem Attribut "employer" zuzuweisen, müssen Sie eine vorhandene Entity von der Dataclass "Company" übergeben. Zum Beispiel:
$emp:=ds.Employee.new() // einen employee anlegen $emp.lastname:="Smith" //einem Attribut einen Wert zuweisen $emp.employer:=ds.Company.query("name =:1";"4D")[0] /eine Entity company zuweisen $emp.save()
4D bietet eine zusätzliche Möglichkeit, um ein Verknüpfungsattribut für eine Entity N einzugeben, die mit einer Entity "1" verknüpft ist: Sie übergeben den Primärschlüssel der Entity "1" direkt, wenn dem Verknüpfungsattribut ein Wert zugewiesen wird. Damit das funktioniert, übergeben Sie dem Verknüpfungsattribut Daten vom Typ Zahl oder Text (Wert des Primärschlüssels). 4D übernimmt dann automatisch die Suche nach der entsprechenden Entity in der Dataclass. Zum Beispiel:
$emp:=ds.Employee.new() $emp.lastname:="Wesson" $emp.employer:=2 //dem Verknüpfungsattribut einen Primärschlüssel zuweisen //4D sucht nach der Company mit dem Primärschlüssel 2 (in diesem Fall nach seiner ID) //und weist ihn dem employee zu $emp.save()
Das ist besonders hilfreich, wenn Sie große Datenmengen aus einer relationalen Datenbank importieren. Diese Art von Import enthält normalerweise eine Spalte "ID", die auf einen Primärschlüssel verweist, den Sie dann direkt einem Verknüpfungsattribut zuweisen können. Das bedeutet auch, dass Sie Primärschlüssel in den N Entities zuweisen können, ohne dass entsprechende Entities bereits in der Datastore Class 1 angelegt wurden. Weisen Sie einen Primärschlüssel zu, der nicht in der verknüpften Datastore Class existiert, wird er trotzdem gespeichert und von 4D zugewiesen, sobald diese Entity "1" erstellt wird.
Sie können den Wert eines verknüpften Entity-Attributs "1" aus der Dataclass "N" direkt über das verknüpfte Attribut zuweisen oder ändern. Wollen Sie z.B. das Attribut name der verknüpften Entity Company einer Entity Employee ändern, schreiben Sie:
$emp:=ds.Employee.get(2) //die Entity Employee mit dem Primärschlüssel 2 laden $emp.employer.name:="4D, Inc." //das Attribut name der verknüpften Company ändern $emp.employer.save() //das verknüpfte Attribut sichern //die verknüpfte Entity ist aktualisiert
Das Objekt Entity selbst kann nicht als Objekt kopiert werden:
$myentity:=OB Copy(ds.Employee.get(1)) //gibt Null zurück
Die Eigenschaften der Entity sind dagegen aufzählbar:
ARRAY TEXT($prop;0) OB GET PROPERTY NAMES(ds.Employee.get(1);$prop) //$prop enthält die Namen aller Entity-Attribute
Für Exportzwecke können Sie eine Entity über die Methode entity.toObject( ) in ein reguläres Objekt konvertieren. Dann können Sie die Entity als JSON exportieren, zum Beispiel:
C_OBJECT($entity_json) $entity_json:=JSON Stringify($myentity.toObject()) //gibt die Entity als JSON zurück