Самый простой способ программной проверки того, что класс имеет допустимое определение JPA.
-
20-09-2019 - |
Вопрос
Я работаю со многими классами, которые помечены javax.persistence.Entity
и тому подобное.Мой проект связан с созданием метаданных о классах, аннотированных JPA, а не с сохранением самого по себе, поэтому я использую их в качестве тестовых примеров.
Вместо того, чтобы запускать Hibernate или какой-либо другой поставщик JPA, я хотел бы программно проверить (часть моих модульных тестов) что мои объявления JPA действительно действительны.
Какой самый простой способ сделать это?
Решение
Просто создайте максимально простой SessionFactory
или что-то еще, что EclipseLink или OpenJPA предоставляет за EntityManagerFactory
и позвольте им проверить это (при необходимости используя какую-нибудь фиктивную базу данных в памяти).Это слишком сложно, чтобы изобрести это заново.
Для Hibernate это можно сделать с помощью Configuration.buildMappings
:
@RunWith(Theories.class)
public class EntitiesAreValidTest {
@DataPoints
public static Class<?>[] entities = new Class[] {
SimpleEntity.class,
SimpleEntityWithTransientField.class,
TwoFieldEntity.class
};
@Theory
public void classHasValidConfiguration(Class<?> entityClass) {
new AnnotationConfiguration().addAnnotatedClass(entityClass).buildMappings();
}
}
Другие советы
Что плохого в использовании конкретного JPA-провайдера в ваших тестах?В сочетании со встроенной базой данных (например.Apache Derby) вы можете повторно использовать уже реализованную логику.Другая идея — проверить источники EclipseLink, Hibernate, OpenJPA,...чтобы узнать, можете ли вы использовать его напрямую.
Я не уверен, есть ли более простой способ, но вы можете использовать Reflection для доступа к аннотациям класса.
Class class = Example.class;
Annotation[] annotations = class.getAnnotations();
Если вы не доверяете поставщикам JPA (или не хотите их использовать), попробуйте согласовать аннотации JPA (метаданные), полученные с помощью отражения, с метаданными JDBC, полученными с помощью Результатсетметадата (например, см. здесь).
Я не хочу сказать, что это просто, но при правильном подходе у вас должен быть довольно компактный набор вспомогательных методов для проверки основных определений для каждой сущности.И результат может варьироваться в зависимости от того, какой объем функциональности JPA вы хотите охватить.