Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以编程方式检查类是否具有有效的JPA定义的最简单方法_Java_Hibernate_Jpa_Eclipselink_Openjpa - Fatal编程技术网

Java 以编程方式检查类是否具有有效的JPA定义的最简单方法

Java 以编程方式检查类是否具有有效的JPA定义的最简单方法,java,hibernate,jpa,eclipselink,openjpa,Java,Hibernate,Jpa,Eclipselink,Openjpa,我正在处理许多用javax.persistence.Entity等注释的类。我的项目是生成关于JPA注释类的元数据,而不是持久性本身,所以我将它们用作测试用例 我不想启动Hibernate或其他JPA提供程序,而是想通过编程检查——这是我单元测试的一部分——我的JPA声明是否确实有效 最简单的方法是什么?我不确定是否有更简单的方法,但您可以使用反射来访问类的注释 Class class = Example.class; Annotation[] annotations = class.getAn

我正在处理许多用javax.persistence.Entity等注释的类。我的项目是生成关于JPA注释类的元数据,而不是持久性本身,所以我将它们用作测试用例

我不想启动Hibernate或其他JPA提供程序,而是想通过编程检查——这是我单元测试的一部分——我的JPA声明是否确实有效


最简单的方法是什么?

我不确定是否有更简单的方法,但您可以使用反射来访问类的注释

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

只要在EntityManagerFactory后面创建尽可能简单的SessionFactory或EclipseLink或OpenJPA提供的任何东西,并让他们在需要时使用一些内存中的虚拟数据库对其进行验证。它太复杂了,无法再创造

对于Hibernate,可以使用Configuration.buildMappings完成此操作:


在测试中使用具体的JPA提供者有什么错?与嵌入式数据库(如ApacheDerby)相结合,您可以重用已经实现的逻辑。另一个想法是检查EclipseLink、Hibernate、OpenJPA。。。查看是否可以直接使用它。

如果您不信任JPA提供程序或不想使用它们,请尝试协调使用反射检索的JPA注释元数据与使用ResultSetMetaData检索的JDBC元数据,例如,请参阅


我不是说这很简单,但如果采用正确的方法,您应该有一组相当紧凑的助手方法来检查每个实体的基本定义。里程数可能会根据您想要覆盖多少JPA功能而有所不同。

这将是最简单的部分。验证所有注释是否有效是一个困难的问题。我同意@Willi的观点。我想使用它们进行验证,但担心为我的单元测试启动一个提供程序的开销。Hibernate的启动成本很高。我的单元测试通常在构建服务器上执行,所以性能没有问题。已经被认为是TeamCity或类似的东西了吗?@Wili Speed在某种程度上是个问题,即使测试是在CI服务器上执行的。
@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();
    }
}