Метаданные
Каждая сущность со своими атрибутами отражается в метаданных приложения, которые используются механизмами фреймворка для получения полной информации о модели данных. Например, если в метаданных какой-либо атрибут помечен как доступный только для чтения, соответствующие компоненты пользовательского интерфейса будут отключены.
Метаданные являются внутренним механизмом фреймворка и редко используются непосредственно в коде приложения. См. раздел Обзор возможностей, в котором рассматриваются концепции метаданных в Jmix. |
Основной точкой входа в 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 атрибута сущности. Вы можете использовать его для форматирования и парсинга значений атрибутов. |