Создание метамодели для сущностного класса в JPA 2
Автоматическая генерация классов метамодели для сущностного класса в JPA 2
Используемые технологии
- Hibernate 5.0.1.Final
- JPA 2.1
- IntelliJ IDEA 14
- Maven 3.2.5
Кратко покажу как сгенерировать классы метамодели для уже созданных классов сущностей в JPA 2 и Hibernate.
1. Описание метамодели JPA
В JPA 2 добавили функциональность запросов, использующих строго типизированный API-интерфейс критериев. Передаваемый в запрос критерий основывается на метамодели отображенных сущностных классов. Таким образом, получается, что каждый используемый критерий является строго типизированным, а это означает возможность нахождения ошибки на этапе компиляции, а не во время выполнения.
Теперь не придется каждый раз перезапускать приложение после того, как вы узнали об ошибке в вашем запросе.
В API-интерфейсе критериев JPA метамодель создается с именем сущностного класса и суффикса ‘_‘. Т.е. сущность — ClassNameEntity и метамодель — ClassNameEntity_ .
2. Добавление зависимости в maven
pom.xml:
1 2 3 4 5 6 |
<!--Generate metamodel classes ClassName_ --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-jpamodelgen</artifactId> <version>4.3.8.Final</version> </dependency> |
Эта зависимость поможет включить генератор метамодели Hibernate.
3. Настройка Intellij Idea
Добавляем в Settings — Annotation Processors строчку org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor в поле Processor FQ Name. Остальные настройки оставил как есть.
4. Генерация классов метамодели
После сборки проекта в указанной в настройках папке появятся классы метамодели. Здесь приведен пример для статьи JPA — запрос с критерием. Использование API-интерфейса критериев JPA 2. Т.к. оставлял все настройки по умолчанию, то классы появились в target.. Просто перенес их в проект для наглядного описания в указанной статье. Затем отключил галочку Enable annotation processing, чтобы классы не генерировались каждый раз и не возникало ошибки дубликатов классов.
Пример сгенерированного класса ContactEntity_ :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
package ru.javastudy.entities; import ru.javastudy.entities.ContactEntity; import ru.javastudy.entities.ContactTelDetailEntity; import ru.javastudy.entities.HobbyEntity; import java.util.Date; import javax.annotation.Generated; import javax.persistence.metamodel.SetAttribute; import javax.persistence.metamodel.SingularAttribute; import javax.persistence.metamodel.StaticMetamodel; @Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor") @StaticMetamodel(ContactEntity.class) public abstract class ContactEntity_ { public static volatile SingularAttribute<ContactEntity, String> firstName; public static volatile SingularAttribute<ContactEntity, String> lastName; public static volatile SetAttribute<ContactEntity, HobbyEntity> hobbies; public static volatile SingularAttribute<ContactEntity, Integer> id; public static volatile SingularAttribute<ContactEntity, Date> birthDate; public static volatile SingularAttribute<ContactEntity, Integer> version; public static volatile SetAttribute<ContactEntity, ContactTelDetailEntity> contactTelDetails; } |
Подробнее о различных способах генерации метамодели в статье от jboss.org.
Статья о генерации метамодели от jboss.org
jboss.org — JPA Static Metamodel Generator
8