Detail
#28074
Applikationswerte primitiver Typen in der Persistenzschicht cachen
Aktuell werden primitive Modell-Typen, für die es keine direkte Unterstützung auf Datenbankebene gibt beim Zugriff vom Datenbank-Wert (String, Zahl,...) in den jeweiligen Applikationswert (Color, Country,...) umgerechnet. Da die Umrechnung beim Zugriff erfolgt, wird diese Umrechnung bei jedem Zugriff erneut durchgeführt. Für viele Werte, ist das auch völlig ausreichend, wenn entweder die Zugriffe selten oder die Umrechnung trivial ist.
Für komplexere Werte ist das Vorgehen aber nicht optimal. Besser wäre eine Umrechnung beim Laden aus der Datenbank und ein Cachen des Applikationswertes statt des Storage-Wertes.
Anwendung
Um ein primitives Attribut mit einem komplexen Applikationstyp (der so nicht direkt in der Datenbank gespeichert werden kann) auf DB-Ebene zu cachen müssen die folgenden Schritte durchgeführt werden:
- Datenbankspalte für das Attribut definieren. Bei der Definition der Spalte den Storage primitive-column-storage mit dem Storage-Mapping des primitiven Typs deklarieren: {{{
<mo_attribute att_name="color" att_type="String" mandatory="false" db_size="16">
<primitive-column-storage
storage-mapping="com.top_logic.element.meta.complex.ColorValueProvider"
/>
</mo_attribute>
}}}
- Am Attribut im Modell den Storage-Algorithmus primitive-storage mit dem Storage-Mapping "Direct-Mapping" und dem Applikationstyp des Attributs definieren: {{{
<property name="color"
type="tl.util:Color"
>
<annotations>
<storage-algorithm>
<primitive-storage>
<storage-mapping class="com.top_logic.element.meta.kbbased.storage.mappings.DirectMapping"
application-type="java.awt.Color"
/>
</primitive-storage>
</storage-algorithm>
</annotations>
</property>
}}}
- Bei der Änderung in einem Update eine Migrationsanweisung formulieren: {{{ <processors>
<add-mo-attribute table="DemoTypes">
<mo_attribute att_name="color" att_type="String" mandatory="false" db_size="16">
<primitive-column-storage
storage-mapping="com.top_logic.element.meta.complex.ColorValueProvider"
/>
</mo_attribute>
</add-mo-attribute>
<add-annotations name="DemoTypes:DemoTypes.A#color">
<annotations>
<storage-algorithm>
<primitive-storage>
<storage-mapping class="com.top_logic.element.meta.kbbased.storage.mappings.DirectMapping"
application-type="java.awt.Color"
/>
</primitive-storage>
</storage-algorithm>
</annotations>
</add-annotations>
</processors>
}}}
Test
Das Attribut "color" in tl-demo wird jetzt auf DB-Ebene gecacht und nicht mehr beim Zugriff umgewandelt.