Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Использование Metamodel API для моделирования классов объектов

Используйте Metamodel API для создания метамодели управляемых сущностей в определённом юните персистентности. Для каждого класса сущности в конкретном пакете создаётся класс метамодели с завершающим подчеркиванием и атрибутами, которые соответствуют персистентным полям или свойствам класса сущности.

Следующий класс сущностей, com.example.Pet, имеет четыре персистентных поля: id, name, color, и owners:

package com.example;
...
@Entity
public class Pet {
    @Id
    protected Long id;
    protected String name;
    protected String color;
    @ManyToOne
    protected Set<Person> owners;
    ...
}

Соответствующий класс метамодели выглядит следующим образом:

package com.example;
...
@Static Metamodel(Pet.class)
public class Pet_ {

    public static volatile SingularAttribute<Pet, Long> id;
    public static volatile SingularAttribute<Pet, String> name;
    public static volatile SingularAttribute<Pet, String> color;
    public static volatile SetAttribute<Pet, Person> owners;
}

Запросы критериев используют класс метамодели и его атрибуты для ссылки на классы управляемых объектов и их персистентное состояние и взаимосвязи.

Использование классов метамодели

Классы метамодели, которые соответствуют классам сущностей, имеют следующий тип:

javax.persistence.metamodel.EntityType<T>

Процессоры аннотаций обычно генерируют классы метамодели во время разработки или во время выполнения. Разработчики приложений, использующих запросы Criteria, могут выполнить одно из следующих действий:

  • Сгенерировать статические классы метамодели с использованием процессора аннотаций persistence provider-а

  • Получить класс метамодели, выполнив одно из следующих действий:

    • Вызовите метод getModel для корневого объекта запроса

    • Получите объект интерфейса Metamodel, а затем передайте тип объекта в его метод entity.

В следующем фрагменте кода показано, как получить класс метамодели сущности Pet, вызвав Root<T>.getModel:

EntityManager em = ...;
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery(Pet.class);
Root<Pet> pet = cq.from(Pet.class);
EntityType<Pet> Pet_ = pet.getModel();

В следующем фрагменте кода показано, как получить класс метамодели сущности Pet, сначала получив объект метамодели с помощью EntityManager.getMetamodel, а затем вызвав entity объекта метамодели:

EntityManager em = ...;
Metamodel m = em.getMetamodel();
EntityType<Pet> Pet_ = m.entity(Pet.class);

Примечание:

Наиболее распространённым вариантом использования является создание типобезопасных статических классов метамодели во время разработки. Динамическое получение классов метамодели путём вызова Root<T>.getModel или EntityManager.getMetamodel, а затем метода entity, не является типобезопасным и не позволяет приложению вызывать имена персистентных полей и свойств в классе метамодели.


Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)