Самый простой способ программной проверки того, что класс имеет допустимое определение JPA.

StackOverflow https://stackoverflow.com/questions/2262819

Вопрос

Я работаю со многими классами, которые помечены 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 вы хотите охватить.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top