Maneira mais fácil de verificar programaticamente se uma classe tem uma definição JPA válida
-
20-09-2019 - |
Pergunta
Estou trabalhando com muitas aulas que estão anotadas com javax.persistence.Entity
e similar. Meu projeto é sobre a geração de metadados sobre classes anunciadas por JPA, em vez de persistência por si só, por isso estou usando-as como casos de teste.
Em vez de acionar o Hibernate ou algum outro provedor de JPA, gostaria de verificar programaticamente - parte dos meus testes de unidade - que minhas declarações JPA são realmente válidas.
Qual é a maneira mais fácil de fazer isso?
Solução
Basta criar o mais simples possível SessionFactory
ou qualquer que seja o EclipSELink ou o OpenJPA por trás do EntityManagerFactory
e deixe-os validá-lo (usando algum banco de dados de memória fictícia, se necessário). É muito complexo para reinventá -lo.
Para hibernar, isso pode ser feito usando 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();
}
}
Outras dicas
O que há de errado em usar um provedor JPA concreto em seus testes? Em combinação com um banco de dados incorporado (por exemplo, Apache Derby), você pode reutilizar a lógica que já foi implementada. Outra idéia seria verificar as fontes de Eclipselink, Hibernate, OpenJpa, ... para ver se você pode usá -lo diretamente.
Não tenho certeza se há uma maneira mais fácil, mas você pode usar a reflexão para acessar as anotações de uma aula
Class class = Example.class;
Annotation[] annotations = class.getAnnotations();
Se você não confia em provedores JPA (ou não deseja usá -los), tente conciliar anotações JPA (Metadata) recuperadas usando a reflexão com metadados JDBC recuperados usando ResultSetMetAdata (por exemplo, veja aqui).
Não quero que seja simples, mas com a abordagem correta, você deve ter um conjunto bastante compacto de métodos auxiliares para verificar as definições básicas de cada entidade. E a milhagem pode variar dependendo da quantidade de funcionalidade JPA que você deseja cobrir.