package com.example;
...
@Entity
public class Pet {
@Id
protected Long id;
protected String name;
protected String color;
@ManyToOne
protected Set<Person> owners;
...
}
Java Platform, Enterprise Edition (Java EE) 8 Учебник по Java EE |
Назад | Вперёд | Содержание |
Используйте 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);
Примечание: Наиболее распространённым вариантом использования является создание типобезопасных статических классов метамодели во время разработки. Динамическое получение классов метамодели путём вызова |
Назад | Вперёд | Содержание |