Skip to main content
Version: 2.4

Characteristics

A Characteristics is a named dynamic attribute that extends an entity beyond its core fields. Each Characteristics wraps a Form (JSON Schema) and adds metadata controlling how the attribute is stored, indexed, secured, and displayed.

What it's for

  • Data model extension — add new attributes to any entity type without modifying core database tables.
  • Schema governance — each attribute has a formal JSON Schema (via its Form), enforcing validation across all channels.
  • Access control — per-attribute read and write privileges.
  • Search & indexing — per-attribute ElasticSearch mapping control.
  • Display ordering — controls the position of the attribute on forms.

Characteristics are first-class configuration entities — they have validity, localization, audit trail, and can be organized with dataTags and configType.

For the architectural context, see Entities & Characteristics.


Key concepts

attributeName

The attributeName is the key under which the characteristic's value is stored in the entity's dynamic data. It acts as a stable contract between the configuration and the runtime:

  • Must be unique within a given EntityType.
  • Referenced by processes, SpEL scripts, and API consumers to read/write the value.
  • Across Entity Specifications of the same EntityType, characteristics with the same attributeName must be identical to ensure consistent data interpretation.

Form reference

Every Characteristics points to exactly one Form via the form field (FK Form.code). The Form's JSON Schema defines what data the characteristic accepts and how it is rendered.

Privileges

FieldPurpose
editPrivilegePrivilege code required to write this attribute. If unset, all users with entity-edit access can write it.
readPrivilegePrivilege code required to read this attribute. If unset, all users with entity-view access can see it.
readonlyWhen true, the attribute is displayed but cannot be edited in the UI (regardless of privileges).

ElasticSearch indexing (indexMapping)

Controls how the characteristic's value is indexed in ElasticSearch:

ValueDescription
UNTYPEDIndexed as a generic (keyword/text) field — suitable for most cases.
TYPEDIndexed with a type-specific mapping (number, date, boolean) enabling range queries and aggregations.
NONENot indexed — the value is stored but not searchable via ElasticSearch.

Choose TYPED when you need numeric ranges, date filtering, or sorting on this attribute.


Characteristic values

For characteristics that use enumerated values (dropdowns, radio buttons), a set of Characteristic Values can be defined. Each value specifies:

FieldTypeDescription
idUUIDUnique identifier.
valueStringThe stored value.
valueNameStringDisplay label for the value.
isDefaultBoolWhether this is the default selection.
unitOfMeasureStringOptional unit (e.g., GB, Mbps).
validForTimePeriodOptional validity window for the value.
rangeIntervalStringOptional range specification.
characteristicsIdUUIDParent Characteristics this value belongs to.
dataMapAdditional data for the value.
auditInfoObjectStandard audit metadata.

This follows the TM Forum CharacteristicSpecValue pattern — predefined controlled values ensuring data consistency.


Reference

Characteristics (attributes)

FieldTypeRequiredRead-onlyDescription / Notes
idUUIDIdentifier (not for end-user display).
codeStringYesUnique ASCII code (no spaces). Used to reference the characteristic from Entity Specifications and API.
nameStringYesHuman-readable name shown in admin UI.
descriptionStringOptional tooltip / longer description.
titleStringDefault title displayed on forms (up to 255 chars).
attributeNameStringYesKey under which the value is stored in entity data. Must be unique within an EntityType.
formStringCode of the Form (JSON Schema) backing this characteristic (FK Form.code).
configTypeStringBusiness package this characteristic belongs to (FK ConfigType.code).
editPrivilegeStringPrivilege required to write this attribute.
readPrivilegeStringPrivilege required to read this attribute.
readonlyBoolIf true, the attribute is displayed but not editable.
indexMappingStringYesElasticSearch mapping: UNTYPED, TYPED, or NONE.
defaultOrderIntDisplay order on forms. Default 50.
configurableBoolWhether the characteristic is configurable.
uniqueBoolWhether the value must be unique across entities.
requiredBoolWhether the value is mandatory.
extensibleBoolWhether the characteristic can be extended.
draftBoolWhether the characteristic is in draft state.
schemaLocationStringOptional schema location reference.
dataTagsListLabels for grouping and filtering.
validityFrom/ToDateOptional validity window.
validBoolYesComputed from validity; true when within the validity interval.
configMapAdditional metadata.
localizationDataObjectTranslations for name / description.
auditInfoObjectYesStandard audit metadata.

Good Practices

  • Stable code and attributeName — both are referenced by Entity Specifications, processes, and API consumers. Renaming breaks existing data and integrations.
  • One Characteristics per logical attribute — keep each characteristic focused on a single concept. Compose complex profiles in Entity Specifications.
  • Consistent attributeName within an EntityType — if the same attributeName appears in multiple Entity Specifications of the same EntityType, the Characteristics must be identical.
  • Set privileges deliberately — use editPrivilege / readPrivilege for sensitive fields (e.g., financial data, personal information).
  • Choose indexMapping wiselyTYPED enables rich queries but increases index size. Use NONE for large text blobs that don't need search.
  • Use defaultOrder — explicitly set display order to control the layout. Relying on the default (50) for all characteristics leads to unpredictable ordering.
  • Tag consistently — use dataTags to categorize characteristics (core, integration, customer-facing).

See Also