Самый простой способ программной проверки того, что класс имеет допустимое определение JPA - PullRequest
2 голосов
/ 15 февраля 2010

Я работаю со многими классами, которые помечены javax.persistence.Entity и т.п. Мой проект направлен на создание метаданных о JPA-аннотированных классах, а не на постоянство, поэтому я использую их в качестве контрольных примеров.

Вместо того, чтобы запускать Hibernate или какого-либо другого поставщика JPA, я хотел бы программно проверить - часть моих модульных тестов - что мои декларации JPA действительно действительны.

Какой самый простой способ сделать это?

Ответы [ 4 ]

4 голосов
/ 15 февраля 2010

Просто создайте простейший из возможных 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();
    }
}
1 голос
/ 15 февраля 2010

Что плохого в использовании конкретного JPA-провайдера в ваших тестах? В сочетании со встроенной базой данных (например, Apache Derby) вы можете повторно использовать логику, которая действительно уже реализована. Другой идеей было бы проверить источники EclipseLink, Hibernate, OpenJPA, ..., чтобы увидеть, можете ли вы использовать его напрямую.

0 голосов
/ 15 февраля 2010

Если вы не доверяете провайдерам JPA (или не хотите их использовать), попробуйте согласовать аннотации (метаданные) JPA, полученные с помощью отражения, с метаданными JDBC, полученными с использованием ResultSetMetaData (например, см. здесь ).

Я не хочу сказать, что это будет просто, но при правильном подходе у вас должен быть довольно компактный набор вспомогательных методов для проверки базовых определений для каждой сущности. И пробег может варьироваться в зависимости от того, какую функциональность JPA вы хотите покрыть.

0 голосов
/ 15 февраля 2010

Я не уверен, что есть более простой способ, но вы можете использовать Reflection для доступа к аннотациям класса

Class class = Example.class;
Annotation[] annotations = class.getAnnotations();
...