Maneira mais fácil de verificar programaticamente se uma classe tem uma definição JPA válida

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

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top