Метаданные

Каждая сущность со своими атрибутами отражается в метаданных приложения, которые используются механизмами фреймворка для получения полной информации о модели данных. Например, если в метаданных какой-либо атрибут помечен как доступный только для чтения, соответствующие компоненты пользовательского интерфейса будут отключены.

Метаданные являются внутренним механизмом фреймворка и редко используются непосредственно в коде приложения.

Основной точкой входа в API метаданных является бин Metadata. Он предоставляет доступ к информации о сущностях в виде объектов MetaClass и MetaProperty.

В приведенном ниже примере выведены сведения об атрибутах сущности Order:

@Autowired
private Metadata metadata;

public void printOrderProperties() {
    MetaClass metaClass = metadata.getClass(Order.class); (1)
    for (MetaProperty metaProperty : metaClass.getProperties()) { (2)

        String propertyName = metaProperty.getName(); (3)
        MetaProperty.Type propertyType = metaProperty.getType(); (4)
        Class<?> javaType = metaProperty.getJavaType(); (5)
        Range propertyRange = metaProperty.getRange(); (6)

        String info = "name: " + propertyName +
                "\n type: " + propertyType +
                "\n Java type: " + javaType +
                "\n range: " + propertyRange;

        if (propertyRange.isClass()) { (7)
            MetaClass refMetaClass = propertyRange.asClass(); (8)
            Range.Cardinality cardinality = propertyRange.getCardinality(); (9)
            info += "\n reference to: " + refMetaClass;
            info += "\n cardinality: " + cardinality;

        } else if (propertyRange.isEnum()) { (10)
            Enumeration<?> enumeration = propertyRange.asEnumeration(); (11)
            info += "\n enum: " + enumeration;

        } else if (propertyRange.isDatatype()) { (12)
            Datatype<Object> propertyDatatype = propertyRange.asDatatype(); (13)
            info += "\n data type: " + propertyDatatype;
        }

        System.out.println(info);
    }
}
1 Метод Metadata.getClass(javaClass) возвращает объект MetaClass, соответствующий классу сущности Java.
2 Метод MetaClass.getProperties() возвращает коллекцию объектов MetaProperty, соответствующих всем атрибутам сущности.
3 Метод MetaProperty.getName() возвращает имя атрибута сущности.
4 Метод MetaProperty.getType() возвращает тип атрибута: DATATYPE, ENUM, ASSOCIATION, COMPOSITION.
5 Метод MetaProperty.getJavaType() возвращает класс Java атрибута сущности.
6 Метод MetaProperty.getRange() метод возвращает объект Range, который описывает целевой тип атрибута сущности.
7 Метод Range.isClass() возвращает значение true, если атрибут сущности является ссылкой.
8 Вы можете получить мета-класс ссылаемой сущности с помощью метода Range.asClass().
9 Метод Range.getCardinality() возвращает вид связи ссылочного атрибута: ONE_TO_ONE, MANY_TO_ONE, ONE_TO_MANY, MANY_TO_MANY. Вы также можете использовать Range.getCardinality().isMany() чтобы определить, является ли атрибут коллекцией.
10 Метод Range.isEnum() возвращает значение true, если атрибут сущности является перечислением.
11 Метод Range.asEnumeration() метод возвращает объект Enumeration, который можно использовать для итерации по всем константам перечисления.
12 Метод Range.isDatatype() возвращает значение true, если атрибут сущности не является ссылкой или перечислением.
13 Метод Range.asDatatype() возвращает datatype атрибута сущности. Вы можете использовать его для форматирования и парсинга значений атрибутов.